2015-05-05 6 views
2

Как я могу получить через обещание данных из функции обратного вызова? Возможно ли это?Javascript Получите обещание от обратного вызова

Вот мой код:

var bricklets = []; 
var ipcon = new Tinkerforge.IPConnection(); 
pcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) { 
    if (enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) { 
     console.log(''); 
     return; 
    } 
    bricklets.push(new Bricklet(uid, deviceIdentifier, connectedUid)); 
}); 

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

+0

Если вы просто хотите узнать, как использовать обещание, взглянуть на на http://www.html5rocks.com/en/tutorials/es6/promises/ –

+0

Почему вы используете console.log ('') - это место, где вы собираетесь управлять своими данными? – devconcept

ответ

2

Поскольку ваш обратный вызов вызывается обратно несколько раз, он немного сложнее, чем просто promisifying your API, передав resolve/reject в качестве обратных вызовов к вашему методу.

Вы назвали бы resolve с массивом результатов после того, как последний был сделан звонок:

var promise = new Promise(function(resolve, reject) { 
    var bricklets = []; 
    var ipcon = new Tinkerforge.IPConnection(); 
    pcon.on(Tinkerforge.IPConnection.CALLBACK_ENUMERATE, function(uid, connectedUid, position, hardwareVersion, firmwareVersion, deviceIdentifier, enumerationType) { 
     if (enumerationType === Tinkerforge.IPConnection.ENUMERATION_TYPE_DISCONNECTED) { 
      return resolve(bricklets); // when done 
//     ^^^^^^^ 
     } // else if some error happened 
      // return reject(err); 
     bricklets.push(new Bricklet(uid, deviceIdentifier, connectedUid)); 
    }); 
}); 

Теперь, вы на самом деле не получить данные «из обратного вызова» в том смысле, что они будут быть возвращен синхронно (promises are still async callbacks), но вы получите для данных, с которыми намного проще работать, чем с помощью обратных вызовов.

Вы можете потреблять его как

promise.then(function(bricklets) { 
    console.log(bricklets); 
    … // do more 
}); // returns a new promise for the result of "do more" 
Смежные вопросы