Your second code example is the right way to go. Because the scope changes in the new function, this changes too, so you're right to make a reference to this outside of the function.
The reason it failed is because the function is using a that you passed into the function rather than the global a you defined outside it.
In other words:
var a = this;
one().then(function () {
console.log(a)
});