我想使用这样的Promise来调用Google Maps Geocoding API:
function makeGeoCodingRequest(address,bounds) { /* Input parameters: address:a string bounds: an object of class google.maps.LatLngBounds(southWest,northEast) This will return a set of locations from the google geocoding library for the given query */ var url="https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=AIzaSyD9GBloPC20X-1kWRo7sm_0z5xvCiaSd3c"; var promise,response; var messages={ "ZERO_RESULTS":"No results were found", "OVER_QUERY_LIMIT":"We are over the query limit.Wait awhile before making a request", "REQUEST_DENIED":"Request was denied,probably using a bad or expired API Key", "INVALID_REQUEST":"Request was sent without the required address,component or component", "UNKNOWN_ERROR": "There was an error somewhere on Google's servers" }; if(address) promise=Q($.ajax({ type: "GET", url: "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=API_KEY" })); return promise.then(function(data) { if (data.status === "OK") return data; else console.error(messages[data.status]); return null; }); }
当我调用函数makeGeoCodingRequest请求时,我发现我得到了一个Promise而不是一个值:
makeGeoCodingRequest
var geo=makeGeoCodingRequest(address); console.log(Q.isPromise(geo));//returns true
为什么不答应。然后在返回值之前执行?我如何从这个承诺而不是另一个承诺中获得价值?
如果您依赖承诺来返回数据,则必须从函数中返回承诺。
一旦调用堆栈中的1个函数异步,那么要继续线性执行,所有要调用它的函数也必须异步。(异步=返回承诺)
请注意,您的if语句没有花括号,因此,如果条件失败,则仅不会执行后面的第一条语句。
if
我在此示例中对其进行了修复。请注意我添加的备注。
if(address){ promise=Q($.ajax({ type: "GET", url: "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "&key=API_KEY" })); return promise.then(function(data) { // whatever you return here will also become the resolve value of the promise returned by makeGeoCodingRequest // If you don't want to validate the data, you can in fact just return the promise variable directly // you probably want to return a rejected promise here if status is not what you expected if (data.status === "OK") return data; else console.error(messages[data.status]); return null; }); }
您必须makeGeoCodingRequest以以下方式致电。
makeGeoCodingRequest(address,bounds).then(function(data){ // this will contain whatever console.log(data); });