javascript - 正确的链式 Promise 语法

标签 javascript node.js es6-promise

我试图找出如何使用 Promise 来正确地重写我的函数。 原始工作版本如下:

this.accountsAPI.find(filter, function(err,result){
    if (err || 0 == result.length) {
      return res.status(400).json({error: "Can't find the account."});
    }
    var workRequest = req.query.workRequest;
    // result has some records and we assume that _id is unique, so it must have one entry in the array
    var newJob = { jobId: workRequest, acceptedById: result[0]._id, dateCreated: new Date() };
    this.jobsAPI.create( newJob, function(jobErr, jobResult) {
      if (jobErr) { return res.status(400).json({error: "Can't create a new job."}); }
      res.status(200).json({newJob});
    });
});

我将其重写为:

return new Promise(function ( fulfill, reject) {
    this.accountsAPI.find(filter)
      .then(function (result) {
        if (0 == result.length) { return res.status(400).json({error: "Can't create a new job."}); }
        var workRequest = req.query.workRequest;
        // result has some records and we assume that _id is unique, so it must have one entry in the array
        var newJob = { workRequestId: workRequest, acceptedById: result[0]._id, dateCreated: new Date() };
        this.jobsAPI.create( newJob, function(jobErr, jobResult) {
          if (jobErr) { return res.status(400).json({error: "Can't create a new job."}); }
          res.status(200).json({newJob});
        })
      })
      .catch((err) => {
        return res.status(400).json({
        error: "Can't create a job.",
        errorDetail: err.message
      });
});

不确定我是否正确编码了 promise 版本。然而,即使我这样做了,仍然存在链式异步请求,所以我的 Promise 版本只会让事情变得更加复杂。

我应该对此类调用使用 Promise 吗?有没有办法优雅地重写我的代码?

最佳答案

不,将所有内容包装在 Promise 构造函数中并不会自动使其工作。

您应该从 promisifying the asynchronous functions 开始您正在最低级别使用 - 即您的情况,accountsAPI.findthis.jobsAPI.create。为此,您需要 Promise 构造函数:

function find(api, filter) {
    return new Promise(function(resolve, reject) {
        api.find(filter, function(err, result) {
            if (err) reject(err);
            else resolve(result);
        });
    });
}
function create(api, newJob) {
    return new Promise(function(resolve, reject) {
        api.create(newJob, function(err, result) {
            if (err) reject(err);
            else resolve(result);
        });
    });
}

如您所见,这有点重复,您可以为此编写一个辅助函数;但如果您使用的 Promise 库不仅仅是 ES6 Polyfill,它可能已经提供了一个。

现在我们有两个函数,findcreate,它们将返回 Promise。有了这些,您可以将函数重写为简单的

return find(this.accountsAPI, filter).then(function(result) {
    if (result.length == 0)
        throw new Error("Can't find the account.");
    return result;
}, function(err) {
    throw new Error("Can't find the account.");
}).then(function(result) {
    // result has some records and we assume that _id is unique, so it must have one entry in the array
    return create(this.jobsAPI, {
        jobId: req.query.workRequest,
        acceptedById: result[0]._id,
        dateCreated: new Date()
    }).catch(function(err) {
        throw new Error("Can't create a new job.");
    });
}.bind(this)).then(function(newJob) {
    res.status(200).json(newJob);
}, function(err) {
    res.status(400).json({error:err.message});
});

关于javascript - 正确的链式 Promise 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34307754/

相关文章:

javascript - IE 在 sethtml 时丢失自定义标签

javascript - sinon stub 数组对象

node.js - 使用 Stripe 向银行账户汇款 | Node JS

node.js - 在 Heroku 上使用 NodeJS 进行 HTML5 音频转换

javascript - 我通过js创建div,但它没有出现在我的页面上

javascript - react 和传单

javascript - 如何实现 node.js WebSocket 支持?

javascript - 为什么显式调用时 NodeJS 函数参数的行为不同?

javascript - 使用静态值创建已解决的 Promise - 为什么执行仍然是异步的

Javascript Promise,从 catch 返回 null?