簡體   English   中英

使用請求承諾的Node.js嵌套回調不起作用

[英]Node.js nested callbacks using request-promise not working

我有一個非常簡單的nodejs / express API,它在request.get()內部進行request.post() 我只是想重新發送request.get()的響應主體。

我試過使用帶有requestrequest-promise... .then()的簡單回調函數request-promise... .then()方法無濟於事。

const request = require('request')
const rp = require('request-promise')

app.get("/", (req, res) => {
    var mapCenter
    var address = "user query"

    res.send(submitSearch());

    function submitSearch() {
        if (!mapCenter || !mapCenter.lat) {
            googleMapsClient.geocode({
                address: address,
            }, function(err, res) {
                if (!err) {
                    mapCenter = {lat:res.lat, lng:res.lng };

                    submitSearch();
                }
            });
        } else {
            var parameters = {
                uri: domain,
                form: {
                    latitude: mapCenter.lat,
                    longitude: mapCenter.
                },
                json: true
            }
            rp.post(parameters).then(function(res) {
                return getResults(res.id)
             })
        }
    }

    function getResults(id) {
        rp.get(domain+ id).then(function(res) {
            return res.Results;
         })

    }
})


app.get()函數中,我希望我的res.send(submitSearch())rp.post()調用中吐出return getResults(res.id)語句,該語句最終應return res.Results getResults()函數。

其中最令人困惑的部分是,我需要在submitSearch()使用怪異的if語句,以便googleMapsClient正確分配mapCenter ,然后再次遞歸調用submitSearch() 我了解這是一個異步問題,我看過的無數線程和視頻都沒有涉及這種特殊情況。

我建議對.geocode()使用promise API,然后您就不會嘗試將普通的回調和promise混合使用。 這不僅可以簡化您的代碼,還可以使強大的錯誤處理變得更加簡單。 到目前為止,我在這里看到的所有建議都缺少各種錯誤處理。 我也看不出您為什么需要在此處遞歸調用自己的任何原因。

const rp = require('request-promise');

app.get("/", (req, res) => {
    let address = "user query";

    // use promise interface for geocode
    googleMapsClient.geocode({address}).asPromise().then(response => {
        return {lat: response.lat, lng: response.lng };
    }).then(mapCenter => {
        const parameters = {
            uri: domain,
            form: {
                latitude: mapCenter.lat,
                longitude: mapCenter.lng
            },
            json: true
        };
        return rp.post(parameters);        
    }).then(id => {
        return rp.get(domain+ id).then(res => res.Results);
    }).then(results => {
        res.send(results);
    }).catch(err => {
        // decide what to do here if there's an error
        console.log(err);
        res.sendStatus(500);
    });
});

請注意, 有關使用諾言Google文檔顯示了以下內容:

const googleMapsClient = require('@google/maps').createClient({
  key: 'your API key here',
  Promise: Promise
});

因此,可能在初始化此類內容以使用內置Promise時需要告訴它使用哪個Promise實現。

歡迎來到StackOverflow! 而且,正如我在您的代碼上看到的那樣,您在設置函數之前先調用res.send。 然后,commitSearch正在調用自身? 為了方便起見,我將這樣重寫代碼:

const request = require('request')
const rp = require('request-promise')

app.get("/", (req, res) => {
    var mapCenter;
    var address = "user query";

    if (!mapCenter || !mapCenter.lat) {
        googleMapsClient.geocode({
            address: address,
        }, function(err, geocodeResponse) {
            if (!err) {
                mapCenter = {lat:res.lat, lng:res.lng };
                res.send(geocodeResponse);
            } else {
                throw err; // throw the error if isn't a assert.
            }
        });
    } else {
        var parameters = {
            uri: domain,
            form: {
                latitude: mapCenter.lat,
                longitude: mapCenter.lng
            },
            json: true
        };
        rp.post(parameters).then(function() {
            rp.get(domain+ id).then(function(reqPromiseRes) {
                res.send(geocodeResponse);
            })
        });
    }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM