我很难理解 Promise 是如何工作的。在基础上,我了解什么和resolve
是。reject
.catch ()
但是,我正在尝试创建一个 Promise 函数(使用Bluebird),该函数本身使用另一个 Promise 函数,并且我想从这个嵌套的 Promise 函数返回解析或拒绝。所以我做了以下事情:
FacebookMessengerAPI.js
const request = require("request-promise");
const Prom = require("bluebird");
exports.send = (sender_psid, response) => {
return Prom.try(() => {
if (sender_psid == null || sender_psid == undefined || sender_psid == "") {
console.error("Invalid sender_psid: \t" + sender_psid);
let error = {
code : errorCodes.ERR_INVALID_PARAMETER,
message : "Invalid sender_psid value"
}
return Prom.reject(error); // This works fine
}
if (response == null || response == undefined) {
console.error("Response body is either null or undefined:\t" + response);
let error = {
code : errorCodes.ERR_INVALID_PARAMETER,
message : "Response is either null or undefined"
}
return Prom.reject(error); // This also works fine
}
let options = {
url : appConstants.URL_FACEBOOK_GRAPH_API,
qs : { access_token : appConstants.TOKEN_PAGE_ACCESS },
method : "POST",
body : response,
json : true
};
request(options)
.then((responseBody) => {
console.log("ResponseBody: \t" + responseBody);
}, (rejected) => {
if (rejected.error.error.message) {
let error = {
code : errorCodes.ERR_FB_GRAPH_API,
message : rejected.error.error.message
}
throw error; // This is where things go wrong
}
})
.catch((err) => {
console.error("Error while calling FB Graph API:\n" + err);
let error = {
code : errorCodes.ERR_UNMAPPED_ERROR,
message : err
};
});
});
}
TestApp.js——调用这个 API 的人
"use strict";
const facebookMessengerApi = require("./service/FacebookMessengerApi");
facebookMessengerApi.send(1111,1111).then((resolved) => {
if (resolved) {
console.log("Resolves ==> ",resolved);
}
}, (rejected) => {
if (rejected) {
console.log("Rejected:\t" + someshit);
throw new Error("An err thrown here")
}
}).catch((error) => {
console.error("ERRORIFIED:\n\n" + error);
});
这里的问题是,我不知道如何将 Promise 对象从request
本身是 Promise 函数并嵌套在父 Promise 函数中的函数发送到父 Promise 函数。
关于请求功能的解决/拒绝:
当我抛出错误时
throw new error
,它被捕获在函数的立即.catch
块中request
。它永远不会交给这个 API 的实际调用者当我使用 时
Prom.reject(error)
,我会收到unhandled rejection
警告,尽管我不知道我没有在哪里处理它,因为我已经在request
方法和这个 API 的调用者中处理了它。除此之外,Prom.reject(error)
实际上最终出现在函数的.catch()
块中,request
而不是调用者函数的块中。