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