2017-08-04 2 views
0

In VueJS ich mit axios einen boolean zurück bin versuchtWie zurückzukehren boolean mit axios

allContactsSaved() { 
    let promise = axios.get('/contacts'); 
    console.log(promise.then(function (response) { 
     response.data.data.forEach(function(contact) { 
      if (!contact.saved) { 
      return false; 
      } 
     }); 
     return true; 
    })); 
    } 

Die console.log nur

Versprechen zurückkehrt {[[PromiseStatus]]: „pending ", [[PromiseValue]]: undefined}

Aber ich will entweder wahr oder falsch im Gegenzug.

+2

Mögliche Duplikat [How gebe ich die Antwort von einem asynchronen Anruf zurück?] (https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – Svenskunganka

+0

Wie kann ich die Rückruffunktion in meinem Beispiel? –

Antwort

0

Das Problem ist nicht mit VueJS weder Axios ... Ich glaube, Sie missverstehen Promises

Ihre Funktion ist asynchron und verwenden Sie Promises, um das Problem sowie Axios zu lösen.

Um allContactsSaved() Rückkehr mit true/false müssen später verwendet werden, haben Sie 3 Möglichkeiten:

1. Promises

Return ein Versprechen, und verwenden Sie .then wenn allContactsSaved ist genannt, wie folgt aus:

// Function 
// Returns promise 
allContactsSaved() { 
    let promise = axios.get('/contacts').then(function (response) { 
     // check if every one is saved 
     const check = response.data.data.every(function(contact) { 
      return contact.saved; 
     }); 
     return check; 
    })); 
    return promise; 
    } 

// Using it: 
allContactsSaved().then(function(isSaved) { 
    console.log(isSaved); 
}); 

2. Rückrufe

Ich denke, die erste Option ist besser als diese. Das ist ein alter Schulweg.

// Function 
// Returns promise 
allContactsSaved(callback) { 
    axios.get('/contacts').then(function (response) { 
     // check if every one is saved 
     const check = response.data.data.every(function(contact) { 
      return contact.saved; 
     }); 
     if(callback) { 
      callback(check); 
     } 
    })); 
    } 

// Using it with function callback: 
allContactsSaved(function(isSaved) { 
    console.log(isSaved); 
}); 

3. Async/erwarten

Das ist neu für ES6/7 und ist abhängig von der Version von JS Motor, müssen Sie eine Transpiler

// Function 
// Returns promise 
async allContactsSaved() { 
    const resp = await axios.get('/contacts'); 
    const check = response.data.data.every(function(contact) { 
     return contact.saved; 
    }); 
    return check; 
    } 

// Using it, the caller function needs to be async: 
async function() { 
    const result = await allContactsSaved(); 
    console.log(result); 
} 
0

Sie können every verwenden, um sicherzustellen, dass jeder Kontakt

return response.data.ever(contact => contact.saved) 

gespeichert ist, aber das wird wieder noch ein Versprechen Sie können Kette ein weiteres Versprechen:

allContactsSaved() { 
let promise = axios.get('/contacts'); 
promise.then(function (response) { 
    return response.data.ever(contact => contact.saved) 
}).then((areTheySaved) => { 
    console.log(areTheySaved); 
}); 

}

+0

Ich bekomme dann die richtige Ausgabe in console.log. Aber wenn ich die Funktion woanders anrufe, um zu überprüfen, ob sie wahr oder falsch ist, bekomme ich die Rückgabe nicht rechtzeitig, weil sie asynchron ist. Wie kann ich auf die Antwort warten? –

+0

geben Sie das Versprechen in 'allContactsSaved' zurück und rufen Sie' .then' auf, wenn Sie das Versprechen verwenden – Posva