2014-11-10 54 views
13

Tôi rất tiếc nếu các chủ đề lời hứa khác đã trả lời câu hỏi này nhưng khi xem một số câu hỏi, tôi không nhận được câu trả lời để giải quyết vấn đề của mình. Tôi có ba tệp json mà tôi muốn lấy, phân tích cú pháp và hợp nhất thủ công. Vấn đề là tôi đang bị mắc kẹt trong tù hứa. Hãy để tôi chỉ cho bạn một số mã từ bộ điều khiển góc cạnh của tôi.Nhận dữ liệu từ lời hứa thay vì trả lại lời hứa

$scope.tests = []; 

$scope.tests = $http.get('results/testResults.json').then(function(res) { 
    return res; 
}); 

console.dir($scope.tests); 

Từ console.dir Tôi nhận được lời hứa nhưng những gì tôi đã hy vọng là dữ liệu từ biến số res. Phải có cách nào đó để lấy dữ liệu đó ra. Không có cách nào để đưa dữ liệu đó ra khỏi lời hứa với một biến toàn cầu để các lời hứa khác của các hàm có thể sử dụng dữ liệu này? Cảm ơn

+1

bạn không lấy dữ liệu ra khỏi cuộc gọi lại, bạn sử dụng dữ liệu trong gọi lại – dandavis

+0

. Sau đó() lời hứa cuối cùng và bảng điều khiển của bạn có –

+0

Đây là cách sai chính xác để sử dụng lời hứa. Lời hứa là không đồng bộ và bạn đang cố gắng sử dụng nó một cách đồng bộ. – greggreg

Trả lời

16

Lời hứa sẽ hoàn thành một thời gian trong tương lai. Bạn đang kiểm tra biến lời hứa trước khi dữ liệu có trong lời hứa. Bạn nên ở lại trong chuỗi lời hứa để sử dụng dữ liệu của bạn. Bên ngoài chuỗi lời hứa, bạn không biết thời gian của các sự kiện không đồng bộ (đó là lý do tại sao bạn sử dụng lời hứa ở nơi đầu tiên).

Nếu bạn thực sự không muốn sử dụng các dữ liệu ngay trong handler .then() đầu tiên của bạn là nơi lý tưởng để sử dụng nó, sau đó bạn có thể chuỗi khác .then() vào lời hứa của bạn:

$scope.tests = $http.get('results/testResults.json'); 

$scope.tests.then(function(data) { 
    // can use data here 
}); 

FYI, những lời hứa không điền dữ liệu vào các biến toàn cầu. Chúng làm cho dữ liệu có sẵn để sử dụng trong các cuộc gọi lại .then() khi những cuộc gọi lại đó được gọi.

+0

Bạn cũng sẽ muốn loại bỏ ánh xạ danh tính đó. – Bergi

+1

Vì vậy, tôi không thể xây dựng một đối tượng lớn và thu thập dữ liệu từ ba tệp json và hợp nhất? Đối với tôi, có vẻ như tôi bị kẹt – jrock2004

+1

@ jrock2004 - bạn phải suy nghĩ và viết mã hơi khác một chút khi sử dụng các hoạt động không đồng bộ. Bạn có thể sử dụng các tính năng hứa hẹn khác như 'Promise.all()' để phối hợp nhiều hoạt động không đồng bộ, do đó bạn có thể chạy một số mã khi tất cả các kết quả async được thực hiện và sử dụng tất cả các kết quả. – jfriend00

-2

Hãy lập một một tài sản và dính nó vào đối tượng cửa sổ, như thế này,

window.myProperty

Sau đó truyền dữ liệu của bạn với nó, từ bên trong lời hứa, như thế này,

window.myProperty = data;

Và nhặt nó lên, khi bạn trở lại bên ngoài, như thế này,

myVariable = window.myProperty;

Hoặc ngược lại, bởi vì tôi dường như không thể có được dữ liệu vào và ra của một số Promises, do đó sẽ đi như thế này,

Một lần nữa, tạo nên một tài sản và dính nó vào đối tượng cửa sổ, như thế này,

window.myProperty

Sau đó truyền dữ liệu của bạn với nó, từ bên ngoài lời hứa, như thế này,

window.myProperty = dữ liệu;

Và nhặt nó lên, khi bạn đang ở bên trong, như thế này,

myVariable = window.myProperty;

Đây không phải là cách tốt nhất để thực hiện việc này! Có ai biết một cách tốt hơn?

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