2016-07-13 5 views
0

저는 Arduino와 같은 입자 광자를 프로그래밍하고 있습니다. 변수를 호출하고 해당 변수를 사용하여 .css 클래스를 div에 추가하려고합니다.jQuery/JavaScript에서 약속 사용에 문제가 있습니다. 스크립트가 대기하지 않는 것 같습니다.

문제는 변수가 초기 호출에

undefined 

로 돌아오고 계속 것입니다. 그러나 몇 초 후에 다시 호출하면 정상적으로 작동합니다. 여기

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); 
}); 

그것의 나의 버전 :

는 입자의 API 호출입니다

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()을 사용하여 비동기 결과를 검색 할 수 있습니다.

  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