为什么从这个 Promise 返回数据时我会得到 undefined?
Why am I getting undefined when returning data from this Promise?
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
函数。
Update:在所有内容之前添加了这段代码,我必须制作一个承诺链,因为我需要等到 TickersSelectFactory.selectSearchedTicker
被调用以及那些结果动作完成后,我调用 2 $emit
's.
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);
弄清楚了,我正在返回我的 ApiFactory 调用,这结束了我的承诺链,然后我才能将数据添加到承诺中以向上解决。
// return ApiFactory.getTickers(null, load).then(function(data) {
ApiFactory.getTickers(null, load).then(function(data) {
case 'searched':
// With the return below, the code never got in to set the promise up and resolve it
// return ApiFactory.getTickers(null, load).then(function(data) {
ApiFactory.getTickers(null, load).then(function(data) {
searchedTickers.that = renderTickers(data.data.tickers, searchedTicker, 'searched');
promise = searchedTickers.that;
console.log('searched promise',promise);
deferred.resolve(promise);
});
break;
您问题的正确解决方案是使用 .then()
提供的 built-in 链接,并消除无关的 $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
,确保此函数的 caller 正确接收 Promise
)
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
函数。
Update:在所有内容之前添加了这段代码,我必须制作一个承诺链,因为我需要等到 TickersSelectFactory.selectSearchedTicker
被调用以及那些结果动作完成后,我调用 2 $emit
's.
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);
弄清楚了,我正在返回我的 ApiFactory 调用,这结束了我的承诺链,然后我才能将数据添加到承诺中以向上解决。
// return ApiFactory.getTickers(null, load).then(function(data) {
ApiFactory.getTickers(null, load).then(function(data) {
case 'searched':
// With the return below, the code never got in to set the promise up and resolve it
// return ApiFactory.getTickers(null, load).then(function(data) {
ApiFactory.getTickers(null, load).then(function(data) {
searchedTickers.that = renderTickers(data.data.tickers, searchedTicker, 'searched');
promise = searchedTickers.that;
console.log('searched promise',promise);
deferred.resolve(promise);
});
break;
您问题的正确解决方案是使用 .then()
提供的 built-in 链接,并消除无关的 $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
,确保此函数的 caller 正确接收 Promise
)