2017-01-24 2 views
1

Я пытаюсь узнать, что такое обещание и как преобразовать обратный вызов в обещание. Пока я конвертирую свой код, чтобы пообещать, я очень смутился по поводу ссылки. Я был бы очень признателен, если вы покажете мне, как преобразовать этот код в качестве простого примера.как преобразовать обратный вызов в обещание

database.ref('/users').on("child_added").then(function(snap){ 
    var subData = snap.val(); 

    database.ref('/subs/' + subData.subid + '/pri/' + snap.key).once("value").then(function(userSnap) { 
    var userData = userSnap.val(); 

    subData.name = userData.name; 
    subData.age = userData.age; 

    database.ref('/subs/' + subData.subid).once("value",function(subDSnap) { 
     var subDData = subDSnap.val(); 
     subData.type = subDData.type; 
     database_m.ref('/users/' + snap.key).set(subData); 
    }); 
    }); 
}); 
+1

потребуется дополнительная информация. Используете ли вы библиотеку, где, как говорят, возвращаются методы Promise? Пример кода, который вы предоставили, слишком мелкий. – Sgnl

ответ

1

Promise не является заменой для каждого типа обратного вызова; скорее, это абстракция вокруг одной конкретной задачи, которая однажды или однажды будет неудачной. Преобразуемый код больше похож на EventEmitter, где может произойти событие несколько раз, поэтому замена .on('child_added', ...) с реализацией Promise не подходит.

Однако в дальнейшем у вас есть звонок .once(...). Это немного ближе к обещанию, потому что оно будет завершено только один раз. Поэтому, если вы действительно хотели его преобразовать, вот что он может выглядеть:

function get(database, url) { 
    return new Promise(function (resolve, reject) { 
    database 
     .ref(url) 
     .once('value', resolve) 
     .once('error', reject); 
    }); 
} 

database.ref('/users').on("child_added", function(snap) { 
    var subData = snap.val(); 

    get(database, '/subs/' + subData.subid + '/pri/' + snap.key) 
    .then(function(userSnap) { 
     var userData = userSnap.val(); 

     subData.name = userData.name; 
     subData.age = userData.age; 

     return get(database, '/subs/' + subData.subid); 
    }) 
    .then(function(subDSnap) { 
     var subDData = subDSnap.val(); 
     subData.type = subDData.type; 
     database_m.ref('/users/' + snap.key).set(subData); 
    }) 
    .catch(function (err) { 
     // handle errors 
    }); 
    }); 
}); 
0

Я не уверен, что понял вопрос, и если ваш «на» возвращается обещание или просто слушать, но в вашем коде вы вложенными «.then», который не является общим способом борьбы с обещания, и я не уверен, что это то, чего вы хотели достичь здесь.

Вы могли бы сделать (при условии, что на функции возвращает обещание, которое я сомневаюсь)

database.ref('/users').on("child_added") 
.then(function(snap){/* do something with the first part of your snap function*/}) 
.then (results => {/* do something else, such as your second ref call*/}) 
.catch(error => {/* manage the error*/}) 

Чтобы узнать о обещаниях, есть много примеров в Интернете, но то, что мне действительно понравилось это promise tutorial at google, с этим хорошо сниппет, что объясняет его

var promise = new Promise(function(resolve, reject) { 
    // do a thing, possibly async, then… 

    if (/* everything turned out fine */) { 
    resolve("Stuff worked!"); 
    } 
    else { 
    reject(Error("It broke")); 
    } 
}); 

тогда, когда у вас есть функция, которая возвращает это обещание, вы можете начать делать

.then(...) 
.then(...) 
.then(...) 
.catch(...) 
+0

Что делать, если ref изменен? – user19283043

+0

, поэтому я не уверен, что полностью получаю ваш код, так как @Sgnl поможет больше. Но в целом вам нужно иметь какую-то функцию, которая возвращает обещание. у вас есть это? это database.ref .... on .. возвращение обещания, или вы просто слушаете какое-то событие. как только у вас есть обещание, вы можете начать цепочку .then(). then(). then(), чтобы указать, что вы хотите сделать последовательно – Fab

Смежные вопросы