ECMAScript 6链接承诺
我试图链接承诺,但第二个不会调用解析函数。 我做错了什么?
function getCustomers(){ let promise = new Promise( function (resolve, reject){ console.log("Getting customers"); // Emulate an async server call here setTimeout(function(){ var success = true; if (success){ resolve( "John Smith"); // got the customer }else{ reject("Can't get customers"); } },1000); } ); return promise; } function getOrders(customer){ let promise = new Promise( function (resolve, reject){ console.log("Getting orders"); // Emulate an async server call here setTimeout(function(){ var success = true; if (success){ resolve( "Order 123"); // got the order }else{ reject("Can't get orders"); } },1000); } ); return promise; } getCustomers() .then((cust) => getOrders(cust)) .catch((err) => console.log(err)); console.log("Chained getCustomers and getOrders. Waiting for results");
代码从第二个功能打印“获取订单”,但不打印“订单123”:
获得客户链接getCustomers和getOrders。 等待结果获取订单
更新。 我想在控制台之间插入返回承诺的链接方法之间的打印。 我猜这样的事情是不可能的:
getCustomers() .then((cust) => console.log(cust)) //Can't print between chained promises? .then((cust) => getOrders(cust)) .then((order) => console.log(order)) .catch((err) => console.error(err));
你想链接一个成功处理程序(对于你的resolve
结果"Order 123"
),而不是一个错误处理程序。 因此,使用then
而不是catch
:-)
getCustomers()
.then(getOrders)
.then((orders) => console.log(orders))
.catch((err) => console.error(err));
没有任何承诺被拒绝,所以你的代码中的console.log(err)
从未被调用过。
我想在控制台之间插入返回承诺的链接方法之间的打印。 我猜这样的事情是不可能的:
getCustomers()
.then((cust) => console.log(cust)) //Can't print between chained promises?
.then((cust) => getOrders(cust))
是的,这是可能的,但你在这里拦截链条。 因此,第二个then
回调实际上不叫cust
,但与第一次的结果, then
回调-和console.log
回报undefined
,与getOrders
会得到一些问题。
你要么做
var customers = getCustomers();
customers.then(console.log);
customers.then(getOrders).then((orders) => …)
或者更简单
getCustomers()
.then((cust) => { console.log(cust); return cust; })
.then(getOrders)
.then((orders) => …)
以下是使用ES6 ECMAScript进行node.js顺序执行的代码示例。 也许有人认为它有用。 http://es6-features.org/#PromiseUsage https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise
var soapClient = easysoap.createClient(params);
//Sequential execution for node.js using ES6 ECMAScript
console.log('getAllFunctions:');
soapClient.getAllFunctions()
.then((functionArray) => {
return new Promise((resolve, reject) => {
console.log(functionArray);
console.log('getMethodParamsByName:');
resolve();
});
})
.then(() => {
return soapClient.getMethodParamsByName('test1'); //will return promise
})
.then((methodParams) => {
console.log(methodParams.request); //Console log can be outside Promise like here too
console.log(methodParams.response);
console.log('call');
return soapClient.call({ //Return promise
method: 'test1',
params: {
myArg1: 'aa',
myArg2: 'bb'
}
});
})
.then((callResponse) => {
console.log(callResponse); // response data as json
console.log('end');
})
.catch((err) => {
throw new Error(err);
});
链接地址: http://www.djcxy.com/p/55455.html
上一篇: ECMAScript 6 Chaining Promises
下一篇: How to cancel an EMCAScript6 (vanilla JavaScript) promise chain