如何在nodejs的编码中使用promise链接

时间:2016-05-10 07:21:41

标签: javascript node.js

exports.updateMyData = function (data) {
    var resultPromise = Q.defer();
    var errorResponse = function (err) {
        resultPromise.reject(err);
    };
    findById(data.id).then(function (mydata) {
        if (!mydata) {
            errorResponse("No item found to update");
        }
        mydata.updateAttributes(data).then(function (mydata) {
            resultPromise.resolve(mydata)
        }, errorResponse)
    }, errorResponse);
    return resultPromise.promise;
};

以上编码工作正常,但我想使用promise链接进行上述编码。请帮我怎么用?

1 个答案:

答案 0 :(得分:2)

你可以这样做:

exports.updateMyData = function (data) {
    return findById(data.id).then(function (mydata) {
        if (!mydata) {
            throw new Error("No item found to update");
        }
        return mydata.updateAttributes(data);
    });
};

或链接如下:

exports.updateMyData = function (data) {
    return findById(data.id).then(function (mydata) {
        if (!mydata) {
            throw new Error("No item found to update");
        }
        return mydata;
    }).then(function(data) {
        return mydata.updateAttributes(data);
    });
};

请注意这两个选项如何返回内部承诺而不是创建新承诺。此外,throw处理程序中的.then()将自动拒绝该承诺。

像原始代码一样创建一个新的承诺,当你可以返回已经拥有的代码时,它被认为是promise anti-pattern,应该避免使用。