Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按同步承诺行事_Javascript_Asynchronous_Es6 Promise - Fatal编程技术网

Javascript 按同步承诺行事

Javascript 按同步承诺行事,javascript,asynchronous,es6-promise,Javascript,Asynchronous,Es6 Promise,我有一些javascript函数可以返回承诺。我正在使用。然后对这些函数返回的数据执行操作。但是,以下代码是否保证订单?result2会在result之后得到处理吗 const test = promiseReturningFunction(data); test.then((result) => { doStuff(result); }); const test2 = promiseReturningFunction2(data2); test2.then((result2) =&g

我有一些javascript函数可以返回承诺。我正在使用
。然后
对这些函数返回的数据执行操作。但是,以下代码是否保证订单?
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);
  });
});
简而言之:是
。然后
阻塞?

否,
。然后()
不是阻塞。在第一个代码段中,您不知道是先处理
result
,还是先处理
result2

您可以尝试语法,它更容易理解:

(async () => {
  const result = await promiseReturningFunction(data);
  doStuff(result);
  const result2 = await promiseReturningFunction2(data2);
  doStuff(result2);
})();
wait
表示此代码的执行将停止,直到
promiseReturningFunction
返回的承诺得到解决。

否,
。然后()。在第一个代码段中,您不知道是先处理
result
,还是先处理
result2

您可以尝试语法,它更容易理解:

(async () => {
  const result = await promiseReturningFunction(data);
  doStuff(result);
  const result2 = await promiseReturningFunction2(data2);
  doStuff(result2);
})();

wait
表示此代码的执行将停止,直到
promiseReturningFunction
返回的承诺得到解决。

第一个是异步的,不保证result2之后的result1

promiseReturningFunction(data);
.then((result) => {
  doStuff(result);
})
.then(()=>promiseReturningFunction2(data2))
.then((result2) => {
  doStuff(result2);
})
.catch((err)=> /* Error handling **/);
请试试这个结构


确保doStaff不是任何I/O操作,否则您必须让它们承诺可返回函数

第一个函数是异步的,不能保证result1在result2之后

promiseReturningFunction(data);
.then((result) => {
  doStuff(result);
})
.then(()=>promiseReturningFunction2(data2))
.then((result2) => {
  doStuff(result2);
})
.catch((err)=> /* Error handling **/);
请试试这个结构


确保doStaff不是任何I/O操作,否则您必须让它们承诺可返回功能

否,
然后
对独立承诺的回调顺序不受保证。这对于允许并发处理多个异步任务非常必要

如果您需要一个特定的订单,您需要显式地链接您的承诺回调

在您的情况下,如果您只需要两个
doStuff
调用互相后面运行,但希望同时处理两个
promiseReturningFunction
s,则可以使用

const p1 = promiseReturningFunction(data);
const p2 = test.then(doStuff);
const p3 = promiseReturningFunction2(data2);
Promise.all([p2, p3]).then((stuff, result2) => doStuff(result2));

如果希望两个
promiseReturningFunction
s按顺序运行,则第二个代码段就可以了。

否,独立承诺的
then
回调顺序不保证。这对于允许并发处理多个异步任务非常必要

如果您需要一个特定的订单,您需要显式地链接您的承诺回调

在您的情况下,如果您只需要两个
doStuff
调用互相后面运行,但希望同时处理两个
promiseReturningFunction
s,则可以使用

const p1 = promiseReturningFunction(data);
const p2 = test.then(doStuff);
const p3 = promiseReturningFunction2(data2);
Promise.all([p2, p3]).then((stuff, result2) => doStuff(result2));

如果希望两个
promiseReturningFunction
s按顺序运行,则第二个代码段就可以了。

No,它没有阻塞。如果你想让它们连续执行,把第二个放在第一个的后面。不,这不是阻塞。如果希望它们连续执行,请将第二个放在第一个的内部。