首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ECMAScript 6链接承诺

ECMAScript 6链接承诺
EN

Stack Overflow用户
提问于 2015-05-15 21:14:59
回答 2查看 1.6K关注 0票数 3

我试图连锁承诺,但第二个不调用解决函数。我做错什么了?

代码语言:javascript
复制
function getCustomers(){

  let promise = new Promise((resolve, reject) => {
      console.log("Getting customers");
      // Emulate an async server call here
      setTimeout(() => {
        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((resolve, reject) => {
      console.log("Getting orders");
      // Emulate an async server call here
      setTimeout(() => {
        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");

代码从第二个函数打印“获取订单”,但不打印"Order 123":

让客户把getCustomers和getOrders联系在一起。等待收到订单的结果

Update. I希望在返回承诺的链式方法之间插入控制台上的打印。我想这种事是不可能的:

代码语言:javascript
复制
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));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-15 21:57:28

您希望链接一个成功处理程序(对于resolve结果"Order 123"),而不是一个错误处理程序。所以使用then而不是catch :-)

代码语言:javascript
复制
getCustomers()
  .then(getOrders)
  .then((orders) => console.log(orders))
  .catch((err) => console.error(err));

所有的承诺都没有被拒绝,所以代码中的console.log(err)从未被调用。

我想在控制台上插入返回承诺的链式方法之间的打印。我想这种事是不可能的: getCustomers() .then((cust) => console.log(cust)) //不能在连锁承诺之间打印?.then((cust) => getOrders(cust))

是的,这是可能的,但你在这里拦截了一条链。因此,第二个then回调实际上不是用cust调用的,而是用第一个then回调的结果调用的-- console.log返回undefinedgetOrders会遇到一些问题。

你要么做

代码语言:javascript
复制
var customers = getCustomers();
customers.then(console.log);
customers.then(getOrders).then((orders) => …)

或者更简单

代码语言:javascript
复制
getCustomers()
  .then((cust) => { console.log(cust); return cust; })
  .then(getOrders)
  .then((orders) => …)
票数 6
EN

Stack Overflow用户

发布于 2017-05-16 13:11:43

下面是使用node.js的ES6 ECMAScript顺序执行的代码示例。也许有人觉得它有用。http://es6-features.org/#PromiseUsage Objects/Promise

代码语言:javascript
复制
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);
    });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30268839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档