如何保证异步返回值在函数返回之前保存
How to guarantee that asynchronous return values are saved before function returns?
根据我的理解,下面代码中的100个asyncFunctions将不会执行,直到func返回true之后,此时对I的引用将无效。我猜这段代码中没有任何东西会像预期的那样工作。
Psedo示例代码:
function func(){
var needToKnow = []
for i = 1 to 100 {
needToKnow[i] = asyncFunction( i )
}
//Do some work on needToKnow[i]
return true
}
Javascript怎么做呢?
使用回调:
function func(callback) {
var needToKnow = [],
max = 100;
for (var i = 0; i < max; i++) {
asyncFunction(i, function (result) {
needToKnow.push(result);
if (needToKnow.length == max) { // or something that let you know that its finished
callback(needToKnow);
}
});
}
}
function asyncFunction(i, callback) {
setTimeout(function () {
callback({ index: i });
}, 1000); // Im an async func!
}
并这样使用:
func(function (result) {
console.log(result);
});
小心,不要进入回调地狱
下面是一个使用Q Promise库的例子:
function functionThatCouldThrowError(i){
//It doesn't, but just to give an idea of error propagation.
return { index: i };
}
function asyncFunction(i) {
var deferred = Q.defer();
setTimeout(function () {
try{
var data = functionThatCouldThrowError(i);
deferred.resolve(data);
} catch (error) {
deferred.reject({ index: i, error: error });
}
}, 1000);
return deferred.promise;
}
function doAll() {
var needToKnow = []
for (var i = 0; i < 100; i++) {
needToKnow[i] = asyncFunction( i );
}
return Q.all(needToKnow);
}
doAll().then(function(arg) {
//arg contains all 100 elements
alert("All done");
})
Update:扩展了该示例,以演示如何处理错误。砰砰作响:http://plnkr.co/edit/djWpTKxgvzK2HmkVwvTy?p =预览
相关文章:
- 当使用ajax并将html数据保存为对象时,收听浏览器返回按钮.好的或坏的
- .value返回字符串,直到我将其保存到变量
- 在本地存储中保存并返回随机生成的字符串
- 我的函数不会返回要保存在数组中的对象
- 返回保存为javascript变量的html
- 保存通过Ajax返回的信息后出现$_POST错误
- 保存对“;contentEditable;部分返回到原始HTML文件
- 如何在循环中调用Promise函数并保存其返回值
- 将函数的值保存在返回随机值的变量中
- 保存模型返回错误
- 在浏览器返回/forwd 按钮单击时保存/恢复所有 JavaScript 变量
- 如何将从 JavaScript 返回的文本值保存到 Java 中的字符串变量
- 保存文本框数据并从本地存储返回 - angularJS -
- NodeJS + QUNIT:在测试中保存返回的异常
- 主干.js:保存方法始终返回错误回调
- 为什么我不能将返回的数组保存在另一个现有数组中
- 复选框,并尝试在用户返回时为用户保存所有复选框的状态
- 在操作方法中保存图像,然后将 URL 返回给客户端
- 解析云代码在保存后返回指针而不是对象
- 当我运行返回()时"":""Javascript中的语法,只有当我将文件保存为PHP