Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Es6 Promise - Fatal编程技术网

Javascript 按顺序运行承诺

Javascript 按顺序运行承诺,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我的顺序是: 将文件从本地服务器发布到dropbox 从本地服务器删除文件(成功发布后) 为最近发布的文件创建可共享链接 向用户发送新的可共享链接 (请注意,我使用的是Dropbox API v2) 我的代码: 我正在使用库。 let upload = (req,res) => { let options = { method: 'POST', uri: 'https://content.dropboxapi.com/2/files/upload', head

我的顺序是:

  • 将文件从本地服务器发布到dropbox
  • 从本地服务器删除文件(成功发布后)
  • 为最近发布的文件创建可共享链接
  • 向用户发送新的可共享链接
(请注意,我使用的是Dropbox API v2)

我的代码:

我正在使用库。

let upload = (req,res) => {

let options = {
    method: 'POST',
    uri: 'https://content.dropboxapi.com/2/files/upload',
    headers: {
        'Authorization': 'Bearer Token here',
        'Dropbox-API-Arg': "{\"path\": \"/test/"+req.file.originalname+"\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}",
        'Content-Type': 'application/octet-stream'
    },body: fs.createReadStream(`uploads/${req.file.originalname}`)
};

rp(options)
    .then(() => {return _deleteLocalFile(req.file.originalname)})
    .then(() => {return _generateShareableLink(req.file.originalname)}) // This makes a POST request to the Dropbox API and should return a link.
    .then((shareableLink) => {sendJsonResponse(res, 200, shareableLink)})
    .catch(function (err) {sendJsonResponse(res, 500, err)});
};

根据我的理解(如果我错了请纠正我)承诺并行运行,并超时返回一个值(以先解决的承诺为准)。我如何以特定的顺序运行承诺?我的承诺是否符合最佳实践?

如果在链中使用,您的承诺将按顺序起作用。 我可以建议您也使用ES8
async/await
特性来获得更漂亮的代码

let upload = async (req,res) => {

   let options = {
       method: 'POST',
       uri: 'https://content.dropboxapi.com/2/files/upload',
       headers: {
        'Authorization': 'Bearer Token here',
        'Dropbox-API-Arg': "{\"path\": \"/test/"+req.file.originalname+"\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}",
        'Content-Type': 'application/octet-stream'
       },body: fs.createReadStream(`uploads/${req.file.originalname}`)
   };

   try {
      const request = await rp(options);
      const dlf = await _deleteLocalFile(req.file.originalname);
      const shareableLink= await _generateShareableLink(req.file.originalname);
      const sendedResponse = await sendJsonResponse(res, 200, shareableLink);
   } catch(e) {
      await sendJsonResponse(res, 500, err);
   }

}

当你链接
then
ables时,它们并不是以可能最坏的方式并行运行,但我使用的最简单的方法是使用
.then()
处理程序中的fetch启动一个新的“child”承诺。@SterlingArcher啊,我不知道!!因此,当我使用
then()
链接承诺时,它们按顺序运行?正确,因为
。then
在执行之前等待回调。所以承诺链总是按顺序排列的,除非它失败了。同时,它们都会在已解析的外部执行自己的调用promise@SterlingArcher很抱歉问了这个问题。我不知道
.then()
是按顺序运行的。这太棒了。代码要干净得多。我不知道ES8的这个新特性。似乎我需要通读ES8功能列表。谢谢你的回答!对不起,我有一个简短的问题。
try
块中的代码是否也按顺序运行?是的,它按顺序工作,只需在Promise ResultHanks前使用
Wait
。这很有帮助!