2017-05-24 20 views
6

Tôi đang tìm cách, với Node v7.6 trở lên, để nhận được lời hứa Bluebird (hoặc bất kỳ lời hứa không phải là nguồn gốc nào) khi một hàm async được gọi.Nhận lời hứa Bluebird từ các chức năng chờ đợi không đồng bộ

Trong cùng một cách tôi có thể làm:

global.Promise = require('Bluebird'); // Or Q/When 
var getResolvedPromise =() => Promise.resolve('value'); 

getResolvedPromise 
    .tap(...) // Bluebird method 
    .then(...); 

Xem: May I use global.Promise=require("bluebird")

Tôi muốn để có thể làm điều gì đó như:

global.Promise = require('Bluebird'); // Or Q/When 
var getResolvedAsyncAwaitPromise = async() => 'value'; 

getResolvedAsyncAwaitPromise() 
    .tap(...) // Error ! Native Promises does not have `.tap(...)` 
    .then(...); 

Tôi biết tôi có thể sử dụng bất kỳ lúc nào như sau:

Bluebird.resolve(getResolvedAsyncAwaitPromise()) 
    .tap(...); 

Nhưng tôi đã tò mò nếu có cách nào để thay đổi Lời hứa mặc định trả về AsyncFunction. Hàm tạo dường như được đính kèm:

Lưu ý rằng AsyncFunction không phải là đối tượng chung. Nó có thể thu được bằng cách đánh giá mã sau đây.

Object.getPrototypeOf(async function(){}).constructor 

MDN reference on AsyncFunction

Nếu không có cách nào để thay đổi Promise constructor 's AsyncFunction, tôi muốn biết lý do của khóa này.

Cảm ơn bạn!

+0

Không, đó là không thể. Nếu có, điều đó có nghĩa là bạn sẽ ghi đè lên việc thực hiện lời hứa trên toàn cầu, đó là một cơn ác mộng. – Bergi

Trả lời

8

Có cách nào để thay đổi mặc định Promise được trả về bởi AsyncFunction

số

những lý do của việc này khóa

Khả năng chiếm quyền điều khiển tất cả là gì async function s có thể là sự cố bảo mật. Ngoài ra, ngay cả khi đó là không có vấn đề, nó vẫn không hữu ích để làm thay thế này trên toàn cầu. Nó sẽ ảnh hưởng đến toàn bộ lĩnh vực của bạn, bao gồm tất cả các thư viện mà bạn đang sử dụng. Họ có thể dựa vào việc sử dụng lời hứa gốc. Và bạn không thể sử dụng hai thư viện lời hứa khác nhau, mặc dù chúng có thể được yêu cầu.

Tôi muốn để có thể làm điều gì đó như:

getResolvedAsyncAwaitPromise().tap(...) 

gì bạn thể làm là để bọc các chức năng tại định nghĩa của nó với Promise.method:

const Bluebird = require('Bluebird'); 
const getResolvedAsyncAwaitPromise = Bluebird.method(async() => 'value'); 

getResolvedAsyncAwaitPromise() 
.tap(…) // Works! 
.then(…); 
Các vấn đề liên quan