Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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 JS chained Promise代码语法改变了运行的顺序-为什么?_Javascript_Promise - Fatal编程技术网

Javascript JS chained Promise代码语法改变了运行的顺序-为什么?

Javascript JS chained Promise代码语法改变了运行的顺序-为什么?,javascript,promise,Javascript,Promise,我正在尝试使用链式承诺按顺序运行异步进程 我从这个开始: var dataStore = {}; DBCalls.GetAllProjects() .then((data) => ProcessData.StoreProjects(data,dataStore)) .then(ProcessData.DoStuff(dataStore)) 上述函数在StoreProjects函数之前完成了DoStuff函数。(以错误的顺序运行) 这将以正确的顺序运行函数 有人能解释一下语法上的区别吗 是

我正在尝试使用链式承诺按顺序运行异步进程

我从这个开始:

var dataStore = {};
DBCalls.GetAllProjects()
.then((data) => ProcessData.StoreProjects(data,dataStore))
.then(ProcessData.DoStuff(dataStore))
上述函数在StoreProjects函数之前完成了DoStuff函数。(以错误的顺序运行)

这将以正确的顺序运行函数

有人能解释一下语法上的区别吗

是因为StoreProjects Resolve没有返回任何内容,而且回调签名不同吗

额外信息:
所有函数都使用返回承诺。

如果函数返回承诺,如果要等待承诺解析,然后再转到链中的下一个处理程序,则应在承诺处理程序中使用return语句

var dataStore = {};
return DBCalls.GetAllProjects()
  .then((data) => { return ProcessData.StoreProjects(data, dataStore); })
  .then(() => { return ProcessData.DoStuff(dataStore); })

在第一段代码中,您立即调用了…DoStuff。当然它会先结束。您没有等到第一个函数完成后才调用它。另外,ProcessData.StoreProjects函数是否返回promise?这就是为什么
.then()
的参数应该始终是函数的原因。将函数作为参数传递是延迟运行回调的方式。因为
ProcessData.DoStuff(数据存储)
()=>{ProcessData.DoStuff(数据存储)}
不同。是的,一个表达式生成调用
DoStuff
的函数,另一个表达式是对
DoStuff
本身的调用。
var dataStore = {};
return DBCalls.GetAllProjects()
  .then((data) => { return ProcessData.StoreProjects(data, dataStore); })
  .then(() => { return ProcessData.DoStuff(dataStore); })