Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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_Promise - Fatal编程技术网

Javascript 如果响应仍然悬而未决,承诺的价值是什么?

Javascript 如果响应仍然悬而未决,承诺的价值是什么?,javascript,promise,Javascript,Promise,我遇到了一个编码挑战,这让我很困惑: function runMultipleQueries(queries) { var results = []; queries.forEach(doQuery); return results; function doQuery(query) { getData(query) .then(results.push.bind(results)); } } function log(value) { console

我遇到了一个编码挑战,这让我很困惑:

function runMultipleQueries(queries) {
  var results = [];
  queries.forEach(doQuery);
  return results;
  function doQuery(query) {
    getData(query)
      .then(results.push.bind(results));
  }
}

function log(value) {
  console.log(value);
}

runMultipleQueries(someArrayOfQueries).forEach(log);
编辑:假设这些函数都是在脚本的其他地方定义的

这个代码块的假设输出是什么?当承诺得到回报的时候,我被难住了,而与此同时又印了什么?我原以为我会看到一个未定义的数组,但现在我不确定

同时印刷的是什么?我想我会看到一系列未定义的

否。承诺尚未兑现,因此尚未执行任何推送操作,并且数组仍然为空。这就是为什么没有任何东西被打印出来,而且永远不会被打印出来

要打印某些内容,您需要打印,直到承诺兑现为止-或者单独打印(当每个结果可用时打印),或者全部打印(将结果放入数组中,然后打印)。对于后者,您不会自己推送它们,而是使用:

同时印刷的是什么?我想我会看到一系列未定义的

否。承诺尚未兑现,因此尚未执行任何推送操作,并且数组仍然为空。这就是为什么没有任何东西被打印出来,而且永远不会被打印出来

要打印某些内容,您需要打印,直到承诺兑现为止-或者单独打印(当每个结果可用时打印),或者全部打印(将结果放入数组中,然后打印)。对于后者,您不会自己推送它们,而是使用:



@Phil nested declarationsedit updated没有错,假设它们是在脚本“承诺返回时被难住”的其他地方定义的-不会从任何显示的函数中获取任何承诺
return
ed最终的
forEach
将无事可做:返回的数组为空。
如果响应仍处于挂起状态,承诺的值是多少?
如果承诺的状态为挂起,那就没有了value@Philnested declarationsedit updated没有错,假设它们是在脚本“承诺返回时被难住”的其他地方定义的-不会从任何显示的函数中获取任何承诺
return
ed最终的
forEach
将没有任何作用:返回的数组为空。
如果响应仍处于挂起状态,承诺的值是多少?
如果承诺的状态为挂起,那么它就没有值OK帮助我理解,我认为promise充当占位符,并移动到下一行代码,直到它被解析(得到一个返回的对象)。我认为promise的意义在于,JavaScript不会阻塞线程,并等待某些东西被解析returned@HiYo不,承诺不是将被结果替换的占位符。这是包装纸。JS中没有线程。它是异步的,这意味着它总是立即转到下一行代码——当承诺稍后实现时,它将调用
,然后调用
回调。这会让普通代码“等待”。好吧,那么如果承诺稍后会实现,我们是否会跳过.then()并转到下一个迭代?很抱歉,我需要一步一步地理解这一点:(是的,确切地说,异步进程已经启动,使用
安装处理程序,然后使用
,并立即进入下一个迭代。好的,请帮助我理解,我认为承诺会充当占位符,并移动到下一行代码,直到解决它(获取返回的对象)我认为承诺的意义在于,JavaScript不会阻塞线程并等待某些事情发生returned@HiYo不,承诺不是将被结果替换的占位符。它是一个包装器。JS中没有线程。它是异步的,这意味着它总是立即移动到下一行代码——当承诺被替换时ts完成后,它将调用
然后调用
回调。这会使普通代码“等待”。好的,那么如果承诺稍后实现,我们是否跳过.then()并转到下一个迭代?很抱歉,我需要一步一步地理解这一点:(是的,确切地说,异步进程启动,使用
安装处理程序,然后使用
,并立即进入下一个迭代。
function runMultipleQueries(queries) {
  return Promise.all(queries.map(getData));
}

function logArray(results) {
  for (var value of results)
    console.log(value));
}

runMultipleQueries(someArrayOfQueries).then(logArray);