2016-07-13 9 views
0

Я программирую фотонный фотон (например, Arduino). Я пытаюсь вызвать переменную из нее, а затем использовать эту переменную, чтобы добавить класс .css в div.Проблемы с использованием обещаний в jQuery/JavaScript. Скрипт, похоже, не ждет

Проблема заключается в том, что переменная продолжает возвращаться в

undefined 

на первоначальный вызов. Однако, если я снова назову это через пару секунд, это будет хорошо.

Это API вызов из частиц:

particle.getVariable({ deviceId: 'DEVICE_ID', name: 'temp', auth: token }).then(function(data) { 
    console.log('Device variable retrieved successfully:', data); 
}, function(err) { 
    console.log('An error occurred while getting attrs:', err); 
}); 

Вот моя версия этого:

function getVariable(varName) { 
particle.getVariable({ deviceId: device_ID, name: varName, auth: accessToken }).then(function(data) { 
    return data.body.result; 
    }, function(err) { 
     console.log('An error occurred while getting variable:', err); 
}); 
} 

Я хотел бы иметь возможность работать с этим как

$(".class").addClass(getVariable("var") 

Я довольно новичок в jQuery и Javascript, но я делал тонну чтения на обратных вызовах и обещаниях и не получал нигде. Любая идея, как это сделать?

ответ

1

У вас есть несколько вопросов.

  1. Ваша getVariable() функция должна вернуть обещание от particle.getVariable(). Это позволит вызывающему абоненту getVariable() использовать .then() по возвращенному результату, чтобы получить асинхронный результат.

  2. Обещания не магически делают асинхронную операцию синхронной. Итак, ваша функция getVariable() по-прежнему асинхронна, потому что она основана на результате particle.getVariable(), который является асинхронным. Таким образом, вы не можете напрямую вернуть результат. Вместо этого вы должны заставить его вернуть обещание, и вызывающий объект этой функции может использовать .then() для получения результата async.

  3. С getVariable() будет асинхронным, вам нужно будет использовать getVariable(...) .then (...), чтобы получить доступ к асинхронному результату.

Изменить это:

function getVariable(varName) { 
    return particle.getVariable({ 
     deviceId: device_ID, 
     name: varName, 
     auth: accessToken 
    }).then(function (data) { 
     return data.body.result; // this becomes the fulfilled value of the promise 
    }, function (err) { 
     console.log('An error occurred while getting variable:', err); 
     throw err;     // rethrow error so it will propagate 
    }); 
} 

getVariable("var").then(function (result) { 
    $(".class").addClass(result); 
}, function(err) { 
    // handle error here 
}); 

Для намного больше описания возвращения асинхронного значения, вы можете увидеть это: How do I return the response from an asynchronous call?

+0

О господи. Спасибо огромное! Я играл с вариациями вашего первого раздела кода, но никогда не думал использовать обещание для второго раздела. Тьфу. Есть ли способ заставить его работать с чем-то вроде '$ (". Class "). AddClass (getVariable (" var ")'? Ваше решение работает, но просто надеется упростить. В любом случае, спасибо за help – syndac

+0

@syndac - Нет, результат - асинхронный. Вы не можете вернуть результат непосредственно из 'getVariable()'. – jfriend00

+0

Нет проблем. Еще раз спасибо за помощь! – syndac