函数递归和承诺

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数递归和承诺相关的知识,希望对你有一定的参考价值。

我有一个函数谁发送异步请求的文件块(tmp是我的块)

uploadChunk: function (uploadId, content, offset) {
  var tmp = content.slice(offset, offset + constants.ChunkSize);
  restRequest({
    method: 'POST',
    url: 'file/chunk?uploadId=' + uploadId + '&offset=' + offset,
    data: tmp,
    processData: false,
    contentType: false
  }).then(function (resp) {
    // When the upload is finished, we have an json object with a field '_modelType'
    if (typeof resp._modelType === "undefined" || resp._modelType == null) {
       return this.uploadChunk(uploadId, content, resp.received);
    }
    // Here, file is fully upload
  }.bind(this));
}

我想只在我的文件完全上传并使用时才返回一个承诺:

this.uploadChunk(uploadId, content, 0).then(function (){
  console.log("My file is uploaded");
  .... // use my new file
})

我试图创建一个promise但是一旦我的函数被递归调用,就不再定义resolve函数了。

需要帮忙 :)

答案

我想只在我的文件完全上传并使用时才返回一个承诺:

你提出的建议没有任何逻辑意义。承诺的整个要点(以及一般的异步代码)是它们没有立即完成。因此,即使您稍后可以返回某些内容,您的函数的原始调用者也会很久没有收到您返回的值。

幸运的是,你已经有98%的方法来解决这个问题而且没有意识到这一点。

你只需要在这里添加return这个词

return restRequest({

当有更多工作要做时,你的.then()方法的uploadChunk部分会返回一个承诺。这意味着您最初从uploadChunk函数返回的承诺将继续等待,直到完成所有工作。

就试一试吧。

另一答案

如何使用回调代替承诺通知已完成的操作

uploadChunk: function (uploadId, content, offset, callback) {
  var tmp = content.slice(offset, offset + constants.ChunkSize);
  restRequest({
    method: 'POST',
    url: 'file/chunk?uploadId=' + uploadId + '&offset=' + offset,
    data: tmp,
    processData: false,
    contentType: false
  }).then(function (resp) {
    // When the upload is finished, we have an json object with a field '_modelType'
    if (typeof resp._modelType === "undefined" || resp._modelType == null) {
       return this.uploadChunk(uploadId, content, resp.received, callback);
    }
    // Here, file is fully upload
    callback && callback(resp);
  }.bind(this));
}

然后对此回调中的操作事件做出反应

this.uploadChunk(uploadId, content, 0, function(resp) {
  console.log("My file is uploaded");
  .... // use my new file
});

因此,即使您有递归,每次操作完成时您都会收到通知。

以上是关于函数递归和承诺的主要内容,如果未能解决你的问题,请参考以下文章

节点递归承诺永远不会退出

使用承诺和递归迭代文件目录

在 node.js 中承诺一个递归函数

等待递归 readdir 函数结束

节点 q 承诺递归

如何使用 Promise Kit 调用递归函数?