我的代码中遇到了一个让我困惑很长时间的错误,我正在寻找一些澄清。
在此代码中,注释掉的内部承诺导致了问题。一旦setTimeout命中,而不是在超时内的解析之后,Promise.all()在结束时继续。
使用promise保留异步代码可以解决流问题,但为什么会这样?
基本上,为什么我们不能在.then()链中运行普通的异步代码,在异步回调结束时返回一个Promise.resolve()?
var asyncPromise = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('Async Promise done');
resolve();
}, 1000);
});
};
var generateSignupPromises = function(qty) {
var promiseArray = [];
for (var i = 1; i <= qty; i++) {
promiseArray.push(
function() {
return asyncPromise()
.then(function() {
console.log('Before Timeout');
//Uncommenting this fixes the issue
//return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('After Timeout');
//resolve();
return Promise.resolve();
}, 500);
//})
});
}
);
}
return promiseArray;
};
var test = generateSignupPromises(1);
Promise.all([test[0]()])
.then(function() {
console.log('Done');
});
指向正在运行的代码的链接:http://www.es6fiddle.net/imfdtuxc/
答案 0 :(得分:5)
为什么我们不能在.then()链中运行正常的异步代码,在异步回调结束时返回一个Promise.resolve()?
你完全可以。但任何值 - 无论是承诺还是其他 - 从普通的异步回调中addPointCloudNormals
只是像往常一样被忽略。
在return
回调中开始异步操作没有任何改变,then
只是不返回一个承诺 - 而setTimeout
将不知道任何异步发生它可以等待。
如果您想从回调中返回一个承诺并获得该最终结果的另一个承诺,那么它必须是then
回调:
then
答案 1 :(得分:0)
然后是同步功能,所以如果你想在那里做异步任务,你必须返回一个Promise。
此外,Promise.all期待一系列承诺。不是数组的数组。
var asyncPromise = function() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('Async Promise done');
resolve();
}, 1000);
});
};
var generateSignupPromises = function(qty) {
var promiseArray = [];
for (var i = 1; i <= qty; i++) {
promiseArray.push(
function() {
return asyncPromise()
.then(function() {
console.log('Before Timeout');
//Uncommenting this fixes the issue
return new Promise(function(resolve, reject) {
setTimeout(function() {
console.log('After Timeout');
resolve();
//return Promise.resolve();
}, 500);
})
});
}
);
}
return promiseArray;
};
var test = generateSignupPromises(1);
Promise.all([test[0]()])
.then(function() {
console.log('Done');
});