我有几个返回promises的javascript函数。我使用.then
对这些函数返回的数据进行操作。但是,下面的代码是否保证订单?在result2
后会result
处理吗?
const test = promiseReturningFunction(data);
test.then((result) => {
doStuff(result);
});
const test2 = promiseReturningFunction2(data2);
test2.then((result2) => {
doStuff(result2);
});
或者应该按照以下方式重写:
const test = promiseReturningFunction(data);
test.then((result) => {
doStuff(result);
}).then(() => {
const test2 = promiseReturningFunction2(data2);
test2.then((result2) => {
doStuff(result2);
});
});
简而言之:.then
阻止了吗?
答案 0 :(得分:2)
不,.then()
没有阻止。在第一个代码段中,您不知道是先处理result
还是result2
。
您可以尝试async functions语法,它更容易理解:
(async () => {
const result = await promiseReturningFunction(data);
doStuff(result);
const result2 = await promiseReturningFunction2(data2);
doStuff(result2);
})();
await
表示在promiseReturningFunction
返回的承诺得到解决之前,将停止执行此代码。
答案 1 :(得分:2)
不,独立承诺的then
回调顺序无法保证。这对于允许并发处理多个异步任务非常必要。
如果您需要特定订单,则需要明确链接您的承诺回调。
在您的情况下,如果您只需要两个doStuff
调用相互运行,但又要同时处理两个promiseReturningFunction
,则可以使用
const p1 = promiseReturningFunction(data);
const p2 = test.then(doStuff);
const p3 = promiseReturningFunction2(data2);
Promise.all([p2, p3]).then((stuff, result2) => doStuff(result2));
如果您希望按顺序运行两个promiseReturningFunction
,那么您的第二个代码段就可以了。
答案 2 :(得分:0)
第一个是异步的,在result2
之后没有对result1的保证CREATE TABLE Employee
(
EmployeeID INT IDENTITY,
Name VARCHAR(100) NOT NULL,
.
.
)
请试试这个结构
确保doStaff不是任何I / O操作,否则你让它们承诺可退回的功能