javascript - 在所有异步、嵌套、$.each 数据库调用完成后做一些事情
问题描述
我正在尝试在 1)所有循环完成和 2)这些循环中的所有数据库调用都完成后运行一个函数。
我的数据库调用函数 (segmentDatabaseCall
和stepDatabaseCall
) 都接受一些参数,解析一个 Promise 并在调用完成后发送数据。这是我的代码的(非常)简化版本:
let localData = {}
segmentDatabaseCall(argument) // Call the database
.then(segmentResult => { // Returns trip segments (array of objects)
$.each(segmentResult, (segmentIndex, segmentValue) => { // For each trip segment...
localData['something'] = segmentValue.something // Add some data to local data
stepDatabaseCall(segmentValue.segment_id) // Call the database once per trip segment...
.then(stepResult => { // Returns trip steps (array of objects)
$.each(stepResult, (stepIndex, stepValue) => { // For each trip step...
localData['something'][i]['something_else'] = stepValue.something_else // Add some data to local data
// THIS DOESN'T WORK
const segsDone = segmentIndex >= segmentResult.length - 1;
const stepsDone = stepIndex >= stepResult.length - 1;
if (segsDone && stepsDone) {
// This if statement runs before all calls are finished 1 out of 3 times roughly
}
})
})
})
})
数据库调用:
function databaseCall (argument) {
return new Promise((resolve, reject) => {
$.ajax({
url: $phpUrl,
type: 'post',
data: {
'argument': argument
}
})
.done (function (data) {
var resultJson = JSON.parse(data)
resolve(resultJson)
})
.fail (function (error) {
reject(error)
})
})
}
我试过在这里使用答案,但它会在所有呼叫完成 1 次之前运行。我一定是错过了那里的一些柜台?
我也认为有一种方法可以使用 Promise 映射来做到这一点,但我无法理解它。
解决方案
看到您已经在使用 JQuery,您可以使用该$.when
函数包装所有异步调用。
这将允许您将所有 Promise 链接在一起,并使用单个.done()
函数管理所有 Promise 的完成。
https://api.jquery.com/jQuery.when/
来自 JQuery 网站:
$.when( $.ajax( "/page1.php" ), $.ajax( "/page2.php" ) ).done(function( a1, a2 ) {
// a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively.
// Each argument is an array with the following structure: [ data, statusText, jqXHR ]
var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It"
if ( /Whip It/.test( data ) ) {
alert( "We got what we came for!" );
}
});
推荐阅读
- c# - C# 错误:CS0103 当前上下文中不存在名称“”
- webstorm - 如果输入来自 WebStorm 中的 Web,如何在控制台中查看输出
- java - 如果不存在则根据点字符串包名创建目录
- python - 我如何阅读特定的一行以及该行下的另外 7 行
- c++ - 读取函数会影响文件的获取指针吗?
- gcc - 如何在 rustc 中使用 gcc 标志
- javascript - 根据位置替换 url 中的 GET 参数(正则表达式)
- mysql - Vue JS 组件中 MySQL 的嵌套 JSON 总和
- asp.net - 如何在 ASP.NET 中正确发布 formcollection?
- ruby-on-rails - “rails new blog”的 Rails 基本安装问题