javascript - titel - title tag definition




Wie man Versprechen wieder verwendet? (2)

Ich versuche, die Daten wieder zu verwenden, die von Versprechen hier zurückgegeben werden. Das Problem ist jedoch, dass nach dem ersten Aufruf der checkPromise Funktion die zweite Funktion sofort checkPromise wird und die Verheißung für die erste Funktion nicht erfüllt ist. Daher gibt sie niemals Daten zurück und gibt daher nie die if-Klausel ein. Wie verwende ich ein Versprechen?

var Promise = require('bluebird');
var request = Promise.promisify(require("request"));


var url = 'http://www.google.com';
var obj = new Object;

function apiCall(url) {
    return new Promise(function (resolve, reject) {

        request(url).spread(function(response, body) {
            return resolve(body);
        }).catch(function(err) {
            console.error(err);
            return reject(err);
        });

    });
}

function checkPromise(url) {
    if(obj.hasOwnProperty(url)) {   
        var rp = obj[url];
        //do something
    }
    else {
        apiCall(url).then(function(result) {            
            obj[url] = result; 
            //do something
        });
    }
}

checkPromise(url);
checkPromise(url);

Angesichts der Art, wie Sie das Ergebnis global in 'obj[url]' speichern, wäre es wahrscheinlich am einfachsten zu tun

function checkPromise(url) {
    if (!obj[url]) obj[url] = apiCall(url);

    obj[url].then(function(result) {
        //do something
    });
}

um die Anfrage im Grunde zu stellen, wenn sie noch nicht begonnen hat, fügen Sie einen Listener an die Zusage für das Laden des Ergebnisses an.


einige Probleme mit Ihrem Code, zuerst in apiCall , Sie machen ein Versprechen ant-Muster (keine Notwendigkeit für diese neue Versprechen), zweitens Ihre checkPromise macht eine Synchronisation, so dass es entweder eine Versprechen zurückgeben muss oder ein Rückruf-Argument, so Ihr Code kann geändert werden in:

var Promise = require('bluebird');
var request = Promise.promisify(require("request"));


var url = 'http://www.google.com';
var obj = new Object;


function apiCall(url) {

    return request(url).spread(function(response, body) {
        return body;
    }).catch(function(err) {
        console.error(err);
        throw err;
    });
}


function checkPromise(url) {
    var promise = Promise.resolve();
    if(obj.hasOwnProperty(url)) {   
        var rp = obj[url];
        //do something
    }
    else {
        return apiCall(url).then(function(result) {            
            obj[url] = result; 
            //do something
        });
    }

    return promise;

}

checkPromise(url).then(function(){
    return checkPromise(url);
});




bluebird