Làm cách nào để tôi thực hiện một lời hứa JavaScript trả lại một cái gì đó ngoài một lời hứa?


38

Tôi có một thông số từ một khách hàng để thực hiện một phương thức trong một mô-đun:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

Nếu được cung cấp một loạt các thể loại,

['comedy', 'drama', 'action']

Đây là một phương pháp bộ xương với một lời hứa:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

Lời hứa có thể được thực hiện để trả về dữ liệu được tìm thấy trong các thể loại không? Có cách nào tốt hơn để đạt được mô tả đặc tả?


8
Hứa không trả lại giá trị, chúng chuyển chúng đến một cuộc gọi lại (mà bạn cung cấp với .then ()). Thông số kỹ thuật chỉ đơn giản là nhầm lẫn với tôi. Có lẽ bạn đang cố gắng nói rằng bạn phải thực hiện resolve([genre1, genre2, ...]);bên trong việc thực hiện lời hứa.
Ixrec

Câu trả lời:


40

Có vẻ như bạn không hiểu cách sử dụng lời hứa. Bạn trả lại một lời hứa. Sau đó, sau đó khi mã của bạn giải quyết lời hứa, nó sẽ giải quyết nó với kết quả và kết quả đó được chuyển đến bộ .then()xử lý kèm theo lời hứa:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});

5
Điều này xác nhận rằng những lời hứa sẽ hoạt động theo cách mà tôi mong đợi.
niêm phong

Có lẽ, bạn không hiểu tại sao điều này có thể cần thiết. Trong môi trường, như React Native với Redux với Realm, tôi phải đặt trạng thái ban đầu cho Redux createdStore. Nó nên được lấy từ Realm, nhưng nó trả lại lời hứa. Tôi chỉ muốn chặn cho đến khi nó trả về dữ liệu vì việc này sẽ rất nhanh và đơn giản. Thay vào đó, tôi gặp vấn đề về cách kết hợp các lời hứa Realm và đối tượng JSON thông thường cho createdStore ()
likeern 26/12/18

26

Phiên bản cập nhật sử dụng awaitchứ không phải .then().

awaitdừng thực thi cho đến khi Lời hứa đã được giải quyết (nghĩa là có giá trị). Không giống như sử dụng, .then()bạn chỉ có thể giữ awaitcác giá trị ing khi bạn chạy các hàm khác nhau trả lại lời hứa và thực thi tiếp tục ở dòng tiếp theo (đây được gọi là style kiểu trực tiếp). Nó cũng nhiều đẹp hơn để nhìn vào, vì nó phù hợp với phần còn lại của JavaScript, hơn .then()ở khắp mọi nơi.

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

Await được hỗ trợ trong tất cả các trình duyệt và nút hiện tại


1
Oh hey wow nhìn, 3 câu hỏi SE về chủ đề này và cuối cùng chúng ta đã có câu trả lời thực sự!
Andrew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.