Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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 Promise.all不显示在最后_Javascript_Promise - Fatal编程技术网

Javascript Promise.all不显示在最后

Javascript Promise.all不显示在最后,javascript,promise,Javascript,Promise,我有几个函数返回一个承诺 有一个start函数,它执行另一个函数 因为这些都是承诺,我使用的是Promise.all,理论上讲,Promise.all应该在所有其他承诺都完成后才显示出来 代码如下: arr = []; function start() { var aPromiseMain = new Promise((resolve, reject) => { myfunction(); arr.push('start'); resolve(console.

我有几个函数返回一个承诺

有一个start函数,它执行另一个函数

因为这些都是承诺,我使用的是Promise.all,理论上讲,Promise.all应该在所有其他承诺都完成后才显示出来

代码如下:

arr = [];

function start() {
  var aPromiseMain = new Promise((resolve, reject) => {
    myfunction();
    arr.push('start');
    resolve(console.log('I am start'))
  })
  return aPromiseMain
}

start();

function myfunction() {
  var aPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
      arr.push('I am myfunction');
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
  return aPromise
}

Promise.all(arr).then(values => {
  console.log(values);
});
现在的情况是,顺序如下:

我要开始了 答应我,一切都来了 我是我的功能 应该是:

我要开始了 我是我的功能 我保证
如何修复此问题?

您的数组应该是承诺数组,而不是字符串数组

arr=[]; 功能启动{ var aPromiseMain=新承诺人解决方案,拒绝=>{ 解决“我开始了” } 回传 } 函数myfunction{ var aPromise=新承诺人解决方案,拒绝=>{ 设置超时=>{ 解决“我是我的函数” }, 2000 } 退票 } arr.pushstart; arr.pushmyfunction; Promise.allarr.thenvalues=>{ console.logvalues; console.logI am done; }; 试试那个方法。

您的代码arr.push'start';例如,只需将字符串添加到数组中。all需要访问实际的Promise对象,而不是字符串。它不能对字符串做任何有用的事情。同样,将console.log的结果作为值发送给resolve函数也没有意义-此参数的目的是将一些数据作为结果返回给侦听器-console.log记录事情,但不返回数据

本例将Promise对象推送到数组中,这样Promise.all将在执行前等待每个对象完成,并在Promise解析时发送有意义的响应

arr=[]; 功能启动{ var aPromiseMain=新承诺人解决方案,拒绝=>{ console.logstart; 我的功能; 下定决心“我开始了”; }; arr.pushaPromiseMain; 回来 } 开始 函数myfunction{ var aPromise=新承诺人解决方案,拒绝=>{ 设置超时=>{ console.logmyfunction; 解决“我是我的功能”; }, 2000 } arr.pushaPromise; 回来 } Promise.allarr.thenvalues=>{ console.logvalues;
}; 从作者的描述和评论来看,他们可能需要在系列中运行承诺,因此这里有一个替代方案:

arr=[]; 功能启动{ console.logI已启动; var aPromiseMain=新承诺人解决方案,拒绝=>{ myfunction.thenresult=>{ 控制台。记录“我完成了”; }; } 回传 } 函数myfunction{ var aPromise=新承诺人解决方案,拒绝=>{ 设置超时=>{ resolveconsole.log“我是我的函数” }, 2000 } 退票 }
开始您永远不会将任何承诺值放入数组中;你只是在推字符串。问题是如果我将字符串添加到resolve'I am start'中;我只能传递一个,所以如果在同一个函数中,我想在代码的不同部分传递两个不同的值,我会得到issuesNo;返回的承诺实例都被忽略。这些是需要进入数组的内容,而不是字符串。这与您要解决的问题无关。您的实现不正确。承诺。一切都是你做出一系列承诺的地方。而是传递一个字符串数组。您不必在当前实现中使用Promise.all。如果您想进行承诺链接,那么可以使用Promise.all.So,基本上您只是在做Promise.all[1,2,3]。然后从start函数内部调用console.logWell myfunction,因此承诺将被推送到数组中。myfunction承诺在这里执行两次,虽然它只记录在一次中,但有一点让人困惑:您使用的是promise.all来并行执行承诺,但从您的描述来看,听起来您需要使用一个_promise.n,然后串联运行它们。您需要哪一个?是的,myfunction两次运行为什么不删除不必要的字符串推入数组?
function start() {
  return new Promise((resolve, reject) => {
    myfunction();
    arr.push('start');
    resolve(console.log('I am start'))
  })
}
function myfunction() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      arr.push('I am myfunction');
      resolve(console.log('I am myfunction'))
    }, 2000)
  })
}
var arr = [start(), myfunction()]
Promise.all(arr).then(values => {
  console.log(values);
});