当前位置:必发365电子游戏 > 编程 > Promise 在Node中是一个骨干性子卡塔尔(قطر‎
Promise 在Node中是一个骨干性子卡塔尔(قطر‎
2019-12-19

Promise API 简介

翻译注: 随处是回调函数,代码非常丰腴难看, Promise 重要用来消除这种编制程序格局, 将或多或少代码封装于在那之中。

Promise 直译为“承诺”,但貌似直接称为 Promise;

代码的可读性特别首要,因为开辟人士支出日常比Computer硬件的支付要大过多倍。

固然联合代码更易于追踪和调节和测量试验, 但异步情势却具备越来越好的习性与灵活性.
如何在平等时刻发起多少个哀告, 然后各自管理响应结果? Promise 现已成为 JavaScript 中那多少个重大的三个组成都部队分, 超级多新的API都是 promise 的措施来促成。上边简介 promise, 以致对应的 API 和应用示例!

Promises 周边

XMLHttpRequest 是异步API, 但不算 Promise 格局。当前使用 Promise 的原生 api 富含:

Promise 会更加的流行,所在此以前端开采需求急速通晓它们。当然, Node.js 是另三个选择 Promise 的阳台(明显, Promise 在Node中是一个中坚天性卡塔尔(قطر‎。

测验 promises 也许比你想像的还要轻便, 因为 setTimeout 能够用来作为异步“任务”!

Promise 基本用法

直接使用 new Promise() 构造函数的主意, 应该只用来管理遗留的异步任务编程, 举例 setTimeout 或者 XMLHttpRequest。 通过 new 关键字创造一个新的 Promise 对象, 该对象有 resolve(搞定!) 和 reject(拒绝!卡塔尔 多个回调函数:

var p = new Promise(function(resolve, reject) {
    // ... ... 
    // 此处,可以执行某些异步任务,然后...
    // 在回调中,或者任何地方执行 resolve/reject

    if(/* good condition */) {
        resolve('传入成果结果信息,如 data');
    }
    else {
        reject('失败:原因...!');
    }
});

p.then(function(data) { 
    /* do something with the result */
}).catch(function(err) {
    /* error :( */
});

相符是由开辟职员依照异步职责实践的结果,来手动调用 resolve 或者 reject. 四个天下无敌的例子是将 XMLHttpRequest 转变为依赖Promise的任务:

// 本段示例代码来源于 Jake Archibald's Promises and Back:
// http://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequest

function get(url) {
  // 返回一个 promise 对象.
  return new Promise(function(resolve, reject) {
    // 执行常规的 XHR 请求
    var req = new XMLHttpRequest();
    req.open('GET', url);

    req.onload = function() {
      // This is called even on 404 etc
      // so check the status
      if (req.status == 200) {
    // Resolve the promise with the response text
    resolve(req.response);
      }
      else {
    // Otherwise reject with the status text
    // which will hopefully be a meaningful error
    reject(Error(req.statusText));
      }
    };

    // Handle network errors
    req.onerror = function() {
      reject(Error("网络出错"));
    };

    // Make the request
    req.send();
  });
};

// 使用!
get('story.json').then(function(response) {
  console.log("Success!", response);
}, function(error) {
  console.error("Failed!", error);
});

神迹在 promise 方法体中无需实行异步职责 —— 当然,在有超大希望会实行异步职责的情事下, 重临 promise 将是最棒的主意, 那样只供给加以结果管理函数就能够。在这里种场馆下, 不须要选择 new 关键字, 直接回到 Promise.resolve() 或者 Promise.reject()即可。例如:

var userCache = {};

function getUserDetail(username) {
  // In both cases, cached or not, a promise will be returned

  if (userCache[username]) {
    // Return a promise without the "new" keyword
    return Promise.resolve(userCache[username]);
  }

  // Use the fetch API to get the information
  // fetch returns a promise
  return fetch('users/' + username + '.json')
    .then(function(result) {
      userCache[username] = result;
      return result;
    })
    .catch(function() {
      throw new Error('Could not find user: ' + username);
    });
};

因为一而再会回去 promise, 所以只必要经过 thencatch 方法管理结果就能够!

then

每一种 promise 实例都有 then 方法, 用来拍卖实行结果。 第多个 then 方法回调的参数, 即是 resolve() 传入的那多少个值:

new Promise(function(resolve, reject) {
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { resolve(10); }, 3000);
})
.then(function(result) {
    console.log(result);
});

// console 输出的结果:
// 10

then 回调由 promise 的 resolved 触发。你也得以选用链式的 then` 回调方法:

new Promise(function(resolve, reject) { 
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { resolve(10); }, 3000);
})
.then(function(num) { console.log('first then: ', num); return num * 2; })
.then(function(num) { console.log('second then: ', num); return num * 2; })
.then(function(num) { console.log('last then: ', num);});

// console 输出的结果:
// first then:  10
// second then:  20
// last then:  40

每个 then 收到的结果都以前边特别 then 重返的值。

后生可畏经 promise 已经 resolved, 但之后才调用 then 方法, 则即时触发回调。如若promise被反驳回绝之后才调用 then, 则回调函数不会被触发。

catch

当 promise 被驳倒时, catch 回调就能被实行:

new Promise(function(resolve, reject) {
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { reject('Done!'); }, 3000);
})
.then(function(e) { console.log('done', e); })
.catch(function(e) { console.log('catch: ', e); });

// console 输出的结果:
// 'catch: Done!'

传入 reject 方法的参数由你协和主宰。平日的话是流传三个 Error 对象:

reject(Error('Data could not be found'));

Promise.all

动脑筋JavaScript加载器的景色: 有时候会接触多个异步交互作用, 但只在具有诉求完毕以往才会做出响应。—— 这种意况能够应用 Promise.all 来处理。Promise.all 方法选择二个 promise 数组, 在有着 promises 都解决之后, 触发三个回调:

Promise.all([promise1, promise2]).then(function(results) {
    // Both promises resolved
})
.catch(function(error) {
    // One or more promises was rejected
});

Promise.all 的特等示例是经过fetch而且提倡三个 AJAX伏乞时:

var request1 = fetch('/users.json');
var request2 = fetch('/articles.json');

Promise.all([request1, request2]).then(function(results) {
    // Both promises done!
});

您也能够构成使用 fetch 和 Battery 之类的 API ,因为她们都回来 promises:

Promise.all([fetch('/users.json'), navigator.getBattery()]).then(function(results) {
    // Both promises done!
});

没有什么可争辨的, 处理推却的状态相比较复杂。要是有个别 promise 被驳倒, 则 catch 将会被第一个推却(rejection卡塔尔国所接触:

var req1 = new Promise(function(resolve, reject) { 
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { resolve('First!'); }, 4000);
});
var req2 = new Promise(function(resolve, reject) { 
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { reject('Second!'); }, 3000);
});
Promise.all([req1, req2]).then(function(results) {
    console.log('Then: ', one);
}).catch(function(err) {
    console.log('Catch: ', err);
});

// From the console:
// Catch: Second!

趁着越来越多的 API 匡助 promise, Promise.all 将会变得最棒有用。

Promise.race

Promise.race 是一个美不可言的函数. 与 Promise.all 相反, 只要某些priomise 被 resolved 可能 rejected, 就能够触发 Promise.racePromise 在Node中是一个骨干性子卡塔尔(قطر‎。:

var req1 = new Promise(function(resolve, reject) { 
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { resolve('First!'); }, 8000);
});
var req2 = new Promise(function(resolve, reject) { 
    // 通过 setTimeout 模拟异步任务
    setTimeout(function() { resolve('Second!'); }, 3000);
});
Promise.race([req1, req2]).then(function(one) {
    console.log('Then: ', one);
}).catch(function(one, two) {
    console.log('Catch: ', one);
});

// From the console:
// Then: Second!

三个案例是诉求的能源有 主站能源和备用财富(以免有个别不可用卡塔尔国。

改正习贯, 使用 Promise

在过去几年中 Promise 一向是个热点话题(假诺你是 Dojo Toolkit 顾客,那么正是现本来就有10年了卡塔尔国, 已经从一个JavaScript框架变成了语言的二个关键元素. 异常快你就能看出大大多新的 JavaScript api 都会基于 Promise 的不二等秘书籍来落成……

... 当然那是豆蔻梢头件善事! 开辟职员能够逃脱回调的火坑, 异步人机联作也得以像任何变量雷同传递. Promise 还亟需风度翩翩段时间来推广, 现在是时候去上学他们了!

正文转发自:众成翻译
译者:铁胖子
链接:
原文:

上一篇:没有了
下一篇:没有了