2015-06-01 43 views
8

Tôi đang sử dụng babel để transpile mã [email protected] của mình và tôi bị kẹt với lời hứa.Promise.allSettled in babel ES6 implementation

Tôi cần allSettled chức năng kiểu mà tôi có thể sử dụng trong các ví dụ qbluebird hoặc .

Trên lõi của babel Promise, không có phương pháp allSettled.

Hiện nay tôi đang sử dụng q.allSettled như một cách giải quyết:

import { allSettled } from 'q';

Có một cái gì đó như thế trong polyfill babel? Ngoài ra, đó là một thuật toán tốt cho tôi để cố gắng thực hiện?

Trả lời

1

Cách khác, đó là thuật toán tốt để tôi thực hiện?

  1. tạo ra một lời hứa mới với một executor function
  2. sử dụng một mảng truy cập/kết quả trong phạm vi của người thi hành
  3. đăng ký một sau đó() gọi lại với nhau lời hứa mẹ lưu kết quả trong mảng
  4. giải quyết/từ chối lời hứa từ bước 1 khi bộ đếm cho biết tất cả lời hứa của phụ huynh đều được thực hiện
+0

Tốt, mặc dù hiện tại tôi sẽ sử dụng Q (có thể làm tương tự). – Zlatko

+0

Đối với bước 4 của bạn, làm thế nào tôi có thể biết để từ chối lời hứa mới? –

+0

@torazaburo bạn nói đúng, bạn sẽ không bao giờ từ chối, đó là điểm của allSettled :) Có thể một số thời gian chờ, nhưng đó là một trường hợp sử dụng khác nhau và không phản ánh những gì q.allSettled nào. – Zlatko

1

Đây là nỗ lực của tôi về điều gì đó tương tự, tôi hav e Dịch vụ bản tin và trong trường hợp của tôi, tôi muốn lời hứa đã được giải quyết của tôi với một loạt tất cả các kết quả (từ chối và nghị quyết), ĐƠN HÀNG, một khi tất cả các email được giải quyết (tất cả các email đã hết):

Newsletter.prototype.allSettled = function(email_promises) { 
    var allSettledPromise = new Promise(function(resolve, reject) { 
     // Keep Count 
     var counter = email_promises.length; 

     // Keep Individual Results in Order 
     var settlements = []; 
     settlements[counter - 1] = undefined; 

     function checkResolve() { 
      counter--; 
      if (counter == 0) { 
       resolve(settlements); 
      } 
     } 

     function recordResolution(index, data) { 
      settlements[index] = { 
       success: true, 
       data: data 
      }; 
      checkResolve(); 
     } 

     function recordRejection(index, error) { 
      settlements[index] = { 
       success: false, 
       error: error 
      }; 
      checkResolve(); 
     } 

     // Attach to all promises in array 
     email_promises.forEach(function(email_promise, index) { 
      email_promise.then(recordResolution.bind(null, index)) 
       .catch(recordRejection.bind(null, index)); 
     }); 
    }); 
    return allSettledPromise; 
} 
0

đây là một mất tại cùng một chức năng: spex.batch

các source code sẽ là quá nhiều để lại bài ở đây, vì vậy đây là chỉ là một ví dụ từ batch processing làm thế nào để sử dụng nó:

var spex = require('spex')(Promise); 

// function that returns a promise; 
function getWord() { 
    return Promise.resolve("World"); 
} 

// function that returns a value; 
function getExcl() { 
    return '!'; 
} 

// function that returns another function; 
function nested() { 
    return getExcl; 
} 

var values = [ 
    123, 
    "Hello", 
    getWord, 
    Promise.resolve(nested) 
]; 

spex.batch(values) 
    .then(function (data) { 
     console.log("DATA:", data); 
    }, function (reason) { 
     console.log("REASON:", reason); 
    }); 

này kết quả đầu ra:

DATA: [ 123, 'Hello', 'World', '!' ] 

Bây giờ chúng ta hãy làm cho nó thất bại bằng cách thay đổi getWord này:

function getWord() { 
    return Promise.reject("World"); 
} 

Bây giờ đầu ra là:

REASON: [ { success: true, result: 123 }, 
    { success: true, result: 'Hello' }, 
    { success: false, result: 'World' }, 
    { success: true, result: '!' } ] 

tức là toàn bộ mảng được giải quyết, báo cáo kết quả chỉ mục.

Và nếu thay vì báo cáo toàn bộ lý do chúng ta gọi là getErrors():

console.log("REASON:", reason.getErrors()); 

thì đầu ra sẽ là:

REASON: [ 'World' ] 

Đây chỉ là để đơn giản hóa truy cập nhanh vào danh sách các lỗi xảy ra .

12

Nếu bạn xem qua số implementation of q.allSettled bạn sẽ thấy nó thực sự khá đơn giản để triển khai. Dưới đây là cách bạn có thể triển khai tính năng này bằng cách sử dụng ES6 Promises:

function allSettled(promises) { 
    let wrappedPromises = promises.map(p => Promise.resolve(p) 
     .then(
      val => ({ state: 'fulfilled', value: val }), 
      err => ({ state: 'rejected', reason: err }))); 
    return Promise.all(wrappedPromises); 
} 
Các vấn đề liên quan