以下data
未定义返回:
function selectSearchedTicker(ticker, load) {
var deferred = $q.defer();
GetTickersFactory.getTickers('searched', load).then(function(data) {
console.log('data',data);
var tempTickers = GetTickersFactory.returnSearchedTickers();
$rootScope.$emit("select.searched.ticker", tempTickers);
deferred.resolve();
});
return deferred.promise;
}
这是
GetTickersFactory.getTickers
函数:function getTickers(type, load, searchedTicker, cached) {
type = type || 'portfolio';
load = load || '';
searchedTicker = searchedTicker || {};
var deferred = $q.defer(),
promise;
if (cached) portfolioCached = cached;
//other code remains same
tickersPane = ScopeFactory.getScope('tickersPanel');
switch (type) {
case 'searched':
return ApiFactory.getTickers(null, load).then(function(data) {
//renderTickers just does logic, no more API call
searchedTickers.that = renderTickers(data.data.tickers, searchedTicker, 'searched');
promise = searchedTickers.that;
console.log('promise',promise); // <-- there is data here
deferred.resolve(promise);
// return returnData(searchedTickers.that);
});
break; // <-- after hitting this break, chrome tools hits the Angular code
//...
}
return deferred.promise; // <- also tried return promise
// other functions...
}
当我记录时,您可以在
promise = searchedTickers.that;
上方看到,我看到了要返回的数据。但是,它永远不会恢复到我原来的selectSearchedTicker
函数。更新:添加了此代码,该代码位于所有内容之前,我必须制作一个Promise链,因为我需要等到调用
TickersSelectFactory.selectSearchedTicker
并完成这些操作的结果之后,再调用2个$emit
。TickersSelectFactory.selectSearchedTicker(fullTicker.ticker, selectTickerUrl).then(function(res) {
console.log('selectSearchedTicker promise returned');
$rootScope.$emit("clear.tags.array");
$rootScope.$emit("search.ticker.clicked", fullTicker);
});
最初看起来像这样,给我带来了问题:
TickersSelectFactory.selectSearchedTicker(fullTicker.ticker, selectTickerUrl);
$rootScope.$emit("clear.tags.array");
$rootScope.$emit("search.ticker.clicked", fullTicker);
最佳答案
解决问题的正确方法是使用.then()
提供的内置链接,并消除多余的$q.defer()
对象:
switch (type) {
case 'searched':
return ApiFactory.getTickers(null, load).then(function(data) {
searchedTickers.that = renderTickers(data.data.tickers, searchedTicker, 'searched');
return searchedTickers.that;
});
...
}
在您的第一个功能中类似:
function selectSearchedTicker(ticker, load) {
return GetTickersFactory.getTickers('searched', load).then(function(data) {
console.log('data',data);
var tempTickers = GetTickersFactory.returnSearchedTickers();
$rootScope.$emit("select.searched.ticker", tempTickers);
return tempTickers;
});
}
(请注意,在函数开始处添加了新的
return
,以确保此函数的调用者正确接收到Promise
)关于javascript - 从此Promise返回数据时,为什么会变得不确定?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34818488/