2015-12-04 41 views
23

Tôi đã có một mã javascript như thế này:Return từ một lời hứa sau đó()

function justTesting() { 
    promise.then(function(output) { 
    return output + 1; 
    }); 
} 

var test = justTesting(); 

Tôi đã luôn luôn là một giá trị không xác định cho kỳ thi này var. Tôi nghĩ rằng đó là bởi vì những lời hứa không được giải quyết máy bay phản lực .. khác là một cách để trả lại một giá trị từ một lời hứa?

Cảm ơn!

+1

giá trị trả về của một cuộc gọi 'sau đó()' lại là lời hứa, kết thúc tốt đẹp giá trị mà bạn đã trả về. – Sirko

+0

Bạn có một lỗi cú pháp, tôi không nghĩ rằng điều này thậm chí phân tích cú pháp. – djechlin

+0

kiểm tra là không xác định bởi vì justTesting trả về không có gì trong ví dụ của bạn (bạn không có trả lại). Thêm trả lại và kiểm tra sẽ được xác định là lời hứa. –

Trả lời

21

Để sử dụng lời hứa, bạn phải gọi một hàm tạo lời hứa hoặc bạn phải tự tạo một lời hứa. Bạn không thực sự mô tả những gì vấn đề bạn đang thực sự cố gắng để giải quyết, nhưng đây là cách bạn sẽ tạo ra một lời hứa tự hỏi:

function justTesting(input) { 
 
    return new Promise(function(resolve, reject) { 
 
     // some async operation here 
 
     setTimeout(function() { 
 
      // resolve the promise with some value 
 
      resolve(input + 10); 
 
     }, 500); 
 
    }); 
 
} 
 

 
justTesting(29).then(function(val) { 
 
    // you access the value from the promise here 
 
    log(val); 
 
}); 
 

 
// display output in snippet 
 
function log(x) { 
 
    document.write(x); 
 
}

Hoặc, nếu bạn đã có một hàm trả về một lời hứa, bạn có thể sử dụng chức năng đó và trở lại lời hứa của mình:

// function that returns a promise 
 
function delay(t) { 
 
    return new Promise(function(resolve) { 
 
    setTimeout(function() { 
 
     resolve(); 
 
    }, t); 
 
    }); 
 
} 
 

 
function justTesting(input) { 
 
    return delay(100).then(function() { 
 
    return input + 10; 
 
    }); 
 
} 
 

 
justTesting(29).then(function(val) { 
 
    // you access the value from the promise here 
 
    log(val); 
 
}); 
 

 
// display output in snippet 
 
function log(x) { 
 
    document.write(x); 
 
}

20

Khi bạn trả lại một cái gì đó từ một cuộc gọi lại sau đó(), đó là một chút phép thuật. Nếu bạn trả về một giá trị, thì sau đó() được gọi với giá trị đó. Tuy nhiên, nếu bạn trả lại một cái gì đó hứa hẹn như thế, tiếp theo sau đó() chờ đợi trên nó, và chỉ được gọi là khi lời hứa đó giải quyết (thành công/thất bại).

qua https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing_asynchronous_actions

+2

Điều này cực kỳ hữu ích, cảm ơn. – Hamsterrific

2

Những gì tôi đã làm ở đây là tôi đã trở về một lời hứa từ chức năng justTesting. Sau đó bạn có thể nhận được kết quả khi chức năng được giải quyết.

function justTesting() { 
    return promise.then(function(output) { 
    return output + 1; 
    }); 
} 

justTesting().then((res) => { 
    var test = res; 
    // do something with the output :) 
    } 

Hy vọng điều này sẽ hữu ích!

+0

Điều gì sẽ xảy ra nếu trong "// làm điều gì đó với đầu ra" Tôi đặt một câu lệnh trả về? Ví dụ: Tôi sẽ có "JustTesting(). Then ..." trong một hàm cha. Tôi có thể trả lại giá trị trong phần "sau đó" không? – mrzepka

+0

Nếu bạn muốn trả về một giá trị từ // làm một cái gì đó với đầu ra, bạn sẽ phải thêm trả về trước khi justTesing(). Ví dụ, "return justTesting(). Sau đó ((res) => {return res;}); –

+0

Được rồi đó là những gì tôi mong đợi, tôi chỉ muốn chắc chắn :) Cảm ơn! – mrzepka

Các vấn đề liên quan