通过 Promises 排队异步操作
Queuing asynchronous operations via Promises
我发现一篇文章解释了如何对异步操作进行排队,但它相当含糊,因为它说如果你 return 来自 then
函数的 "promise-like" 对象, 它将使下一个 then
等待它完成。我不知道 "promise-like" 是什么意思,所以我试了一下(见下面的代码),它起作用了,但我不确定这是否是正确的方法。
let promise = new Promise(function (resolve, reject) {
someAsyncOperation(function () {
resolve({done: true});
});
});
promise.then(function (val) {
return new Promise(function (resolve, reject) {
anotherAsyncOperation(function () {
resolve({doneAgain: true});
});
});
}).then(function (val) {
// This only occurs after the anotherAsyncOperation is done
});
是的,您的代码应该可以创建一个等到 anotherAsyncOperation
完成的承诺。
let promise = new Promise(function(resolve, reject) {
console.log('1');
someAsyncOperation(function() {
resolve({ done: true });
});
}).then(function(val) {
// val == { done: true }
return new Promise(function(resolve, reject) {
console.log('2');
anotherAsyncOperation(function() {
resolve({ doneAgain: true });
});
});
}).then(function(val) {
// val == { doneAgain: true }
console.log('3');
});
@Amit 的意思是您可以创建 "Promisified" 个版本的回调式异步操作。
function promisify( operation ) {
return function( ) {
return new Promise(function(resolve, reject) {
operation(function( err, val ) {
if (err) reject(err);
else resolve(val);
});
});
};
}
var someAsyncOp = promisify( someAsyncOperation );
var anotherAsyncOp = promisify( anotherAsyncOperation );
console.log('1');
var promise = someAsyncOp()
.then(function( val ) {
console.log('2');
return anotherAsyncOp();
})
.then(function( val ) {
console.log('3');
});
请注意,有些 promise 库的 promisify
功能比我展示的要好得多。请使用其中之一。
我发现一篇文章解释了如何对异步操作进行排队,但它相当含糊,因为它说如果你 return 来自 then
函数的 "promise-like" 对象, 它将使下一个 then
等待它完成。我不知道 "promise-like" 是什么意思,所以我试了一下(见下面的代码),它起作用了,但我不确定这是否是正确的方法。
let promise = new Promise(function (resolve, reject) {
someAsyncOperation(function () {
resolve({done: true});
});
});
promise.then(function (val) {
return new Promise(function (resolve, reject) {
anotherAsyncOperation(function () {
resolve({doneAgain: true});
});
});
}).then(function (val) {
// This only occurs after the anotherAsyncOperation is done
});
是的,您的代码应该可以创建一个等到 anotherAsyncOperation
完成的承诺。
let promise = new Promise(function(resolve, reject) {
console.log('1');
someAsyncOperation(function() {
resolve({ done: true });
});
}).then(function(val) {
// val == { done: true }
return new Promise(function(resolve, reject) {
console.log('2');
anotherAsyncOperation(function() {
resolve({ doneAgain: true });
});
});
}).then(function(val) {
// val == { doneAgain: true }
console.log('3');
});
@Amit 的意思是您可以创建 "Promisified" 个版本的回调式异步操作。
function promisify( operation ) {
return function( ) {
return new Promise(function(resolve, reject) {
operation(function( err, val ) {
if (err) reject(err);
else resolve(val);
});
});
};
}
var someAsyncOp = promisify( someAsyncOperation );
var anotherAsyncOp = promisify( anotherAsyncOperation );
console.log('1');
var promise = someAsyncOp()
.then(function( val ) {
console.log('2');
return anotherAsyncOp();
})
.then(function( val ) {
console.log('3');
});
请注意,有些 promise 库的 promisify
功能比我展示的要好得多。请使用其中之一。